2009-1-1 to 2009-1-3
你需要将这个日期发送到服务器进行处理,但是服务器希望所有的日期和时间都是以协调世界时(UTC)为准。
现在假设用户在阿拉斯加。由于他们所处的时区与UTC相差很大,因此日期范围需要转换为如下形式:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
如何使用 JavaScript Date
对象将第一个“localized”日期范围转换为服务器可以理解的内容?
2009-1-1 to 2009-1-3
你需要将这个日期发送到服务器进行处理,但是服务器希望所有的日期和时间都是以协调世界时(UTC)为准。
现在假设用户在阿拉斯加。由于他们所处的时区与UTC相差很大,因此日期范围需要转换为如下形式:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
如何使用 JavaScript Date
对象将第一个“localized”日期范围转换为服务器可以理解的内容?
简单而愚蠢
var date = new Date();
var now_utc = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(),
date.getUTCDate(), date.getUTCHours(),
date.getUTCMinutes(), date.getUTCSeconds());
console.log(new Date(now_utc));
console.log(date.toISOString());
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
这段代码的作用是将输入的日期转换成UTC时间。 - Timnew Date(new Date().toUTCString().substr(0, 25))
- joelvhnow.toUTCString()
而不是(错误的)now_utc.toString()
即可。 - Bergi
toISOString()
方法返回一个字符串,格式为简化扩展的ISO格式(ISO 8601),其长度始终为24或27个字符(YYYY-MM-DDTHH:mm:ss.sssZ
或±YYYYYY-MM-DDTHH:mm:ss.sssZ
),后者表示日期前有符号。时区始终是零UTC偏移,由后缀"Z
"表示。
来源: MDN web docs
您需要使用.toISOString()
方法创建所需的格式。对于不支持此方法的旧版浏览器(ie8及以下版本),可以在此处找到补丁程序:
这将使您能够完成所需操作:
var isoDateString = new Date().toISOString();
console.log(isoDateString);
对于时区处理,moment.js和moment.js timezone是非常宝贵的工具......特别是在客户端和服务器端javascript之间导航时区方面。
toISOString
正确地转换为 UTC。 [toISOString]
以简化的扩展 ISO 格式返回一个字符串... 时区始终是零 UTC 偏移量。此外,在示例中,调用 toISOString
时已经考虑了偏移量。 - FFF这是我的方法:
var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
得到的utc
对象实际上不是一个UTC日期,而是本地日期调整后与UTC时间匹配(请参见评论)。 但是,在实践中它能够胜任工作。
更新:此答案是在调用utc.toString()
、utc.toLocaleString()
等时快速获取UTC日期的一种简单方法。 不过,现代浏览器有更好的解决方案,因此我应该努力改进答案。 基本上,now.toISOString()
(IE 9+)是您要使用的内容。
var usertime = new Date(serverUnixEpochTime*1000)
-> 进入 JavaScript 代码。serverUnixEpochTime = usertime->getTime()/1000
-> 进入服务器。 - 0xC0DEGURUconsole.log( new Date(date.getTime() + date.getTimezoneOffset() * 60000) );
=> Sat Oct 01 2016 15:00:00 GMT+1000 (AEST)```
这是不正确的。它应该显示时间为16:00:00(即凌晨3点-11小时)。
我的答案或DrunkCoder的答案给出了正确的结果。
- CMcClymont不改变日期/时间的情况下转换为ISO格式
var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time)
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z
将日期/时间更改后转换为ISO格式(日期/时间将被更改)
isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z
now.getTimezoneOffset()
取决于用户(浏览器)的时区是在 UTC 之前还是之后。 - Iman Mahmoudinasabconst now = new Date();
const now_utc = new Date(now.toUTCString().slice(0, -4));
console.log(now_utc.toString()); // ignore the timezone
我需要这样做来与日期时间选择库进行接口。但一般情况下,以这种方式处理日期不是好主意。
用户通常希望在本地时间中使用日期时间,因此您可以更新服务器端代码以正确解析带有偏移量的日期时间字符串,然后转换为UTC(最佳选项),或者您可以在客户端将其转换为UTC字符串后发送给服务器(如Will Stern的答案)。
Date.prototype.toUTCArray= function(){
var D= this;
return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
D.getUTCMinutes(), D.getUTCSeconds()];
}
Date.prototype.toISO= function(){
var tem, A= this.toUTCArray(), i= 0;
A[1]+= 1;
while(i++<7){
tem= A[i];
if(tem<10) A[i]= '0'+tem;
}
return A.splice(0, 3).join('-')+'T'+A.join(':');
}
我的解决方案可以让日期保持不变,无论客户端设置了哪个时区。也许有人会发现它很有用。
我的使用情况:
我正在创建一个任务应用程序,在其中设置任务的日期。无论你在哪个时区,这个日期都应该保持不变。
例如,你想在6月25日早上8点给你的朋友打电话。
你在中国的时候5天前(6月20日)创建了这个任务。
然后,在同一天,你飞到纽约待几天。
然后,在6月25日,当你仍然在纽约的时候,你早上7点半醒来(这意味着你应该在30分钟内收到任务通知,即使在你创建任务时所处的中国已经是下午1:30了)
因此,这个任务忽略了时区。这意味着“我想在任何时区都在早上8点做这件事”。
我的做法是“假设你始终在伦敦时区(UTC)”。
这意味着 - 当用户在其本地时区选择日期时,我将此日期转换为UTC中相同的日期。也就是说,你在中国选择了早上8点,但我将其转换为UTC中的早上8点。
然后 - 下次打开应用程序时 - 我读取保存在UTC中的日期并将其转换为你当前时区中相同的日期 - 例如,我将UTC中的早上8点转换为纽约时区中的早上8点。
这个解决方案意味着日期的含义可能因设置它和读取它的地方而异,但它以一种“感觉”像你始终处于同一时区的方式保持不变。
让我们写一些代码:
首先 - 我们有两个主要函数,用于忽略时区从/到UTC的转换:
export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
const timestamp = Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds(),
);
return new Date(timestamp);
}
export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
return new Date(
utcDate.getUTCFullYear(),
utcDate.getUTCMonth(),
utcDate.getUTCDate(),
utcDate.getUTCHours(),
utcDate.getUTCMinutes(),
utcDate.getUTCSeconds(),
utcDate.getUTCMilliseconds(),
);
}
然后,我保存/读取此日期的方式如下:
function saveTaskDate(localDate: Date) {
// I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
api.saveTaskDate(utcDate);
}
function readTaskDate(taskUtcDate: Date) {
// I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);
// this date will have the same calendar day as the one you've picked previously
// no matter where you were saving it and where you are now
}
浏览器可能不同,您还应该记住不要相信客户端生成的任何信息。话虽如此,下面的语句对我有效(在Mac OS X 10.8.2上的Google Chrome v24)。
var utcDate = new Date(new Date().getTime());
编辑:“这与仅使用new Date()
有何不同?”请参见此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
像之前的答案所述,添加60000 * Date.getTimezoneOffset()是不正确的。首先,您必须将所有日期/时间视为已经具有时区修饰符的UTC,以便显示目的。
同样,浏览器可能不同,然而,Date.getTime()返回自1970-01-01 UTC/GMT以来的毫秒数。如果您像我上面那样使用这个数字创建一个新的日期,它将是UTC/GMT。但是,如果您通过调用.toString()显示它,它将似乎是在您的本地时区,因为.toString()使用您的本地时区,而不是调用它的日期对象的时区。
我还发现,如果您在日期上调用.getTimezoneOffset(),它将返回您的本地时区,而不是调用它的日期对象的时区(我无法验证这是否标准)。
在我的浏览器中,添加 60000 * Date.getTimezoneOffset() 会创建一个不是UTC的DateTime。但是,当在浏览器中显示时(例如:.toString()),它会显示一个在我的本地时区中正确的UTC时间,如果忽略时区信息。
new Date()
的输出完全相同,无论是时间戳还是时区都没有改变。请问您需要的是什么样的翻译? - Gras Doublenew Date().getTime()
始终返回一个与时区无关的时间戳。在你尝试将其格式化为除自 Unix 纪元以来毫秒数之外的其他格式之前,它没有相关联的时间戳。 - frontendbeautynew Date(new Date().getTime())
返回的值与 new Date()
返回的值完全相同。您能解释一下您的答案在哪些方面提供了与 new Date()
不同的值吗? - Kirk Wollnew Date("5/19/2014").getTime()
。Date构造函数创建了一个带有+7偏移量的日期。在服务器上(C#),我将发布的值作为毫秒数添加到Unix纪元new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
。结果是5/19/2014 7:00:00 AM
。因此,似乎getTime()给出了包括我的UTC偏移量在内的毫秒数。 - xr280xrnew Date(new Date().getTime())
无法正常工作。我可以确认new Date(Date.UTC(2019, 8, 27, 0, 0, 0))
确实会产生UTC时间。如果你没有使用Date.UTC(...)
,你将得到在你所在时区的UTC偏移日期。 - Alex Barkervar myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
date = '2012-07-28'; stringdate = new Date(date).toISOString();
应该能在大多数更新的浏览器中运行。在 Firefox 6.0 上返回 2012-07-28T00:00:00.000Z