假设您网站的用户输入一个日期范围。

2009-1-1 to 2009-1-3

您需要将此日期发送到服务器进行某些处理,但服务器希望所有日期和时间均采用 UTC 格式。

现在假设用户在阿拉斯加、夏威夷或斐济。由于它们位于与 UTC 完全不同的时区,因此日期范围需要转换为如下所示:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

使用 JavaScript Date 对象,如何将第一个“本地化”日期范围转换为服务器可以理解的内容?

有帮助吗?

解决方案

toISOString() 方法返回简化的扩展ISO格式中的字符串(ISO 8601),总是长24或27个字符(YYYY-MM-DDTHH:mm:ss.sssZ 或者 ±YYYYYY-MM-DDTHH:mm:ss.sssZ, 分别)。时区始终为零 UTC 偏移量,表示为 后缀”Z".

来源: MDN 网络文档

您需要的格式是用以下命令创建的 .toISOString() 方法。对于较旧的浏览器(ie8及以下),本身不支持此方法,可以找到垫片 这里:

这将使您能够执行您需要的操作:

var isoDate = new Date('yourdatehere').toISOString();

对于时区工作, moment.js 和 moment.js 时区 确实是非常宝贵的工具...特别是对于在客户端和服务器 javascript 之间导航时区。

其他提示

简单和笨

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

这是我的方法:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

将所得utc对象是不是一个真正的UTC日期,但一个本地日期偏移以匹配UTC时间(见注释)。然而,在实践中它的工作。

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(':');    
}

<强>转换为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 

小提琴链接

浏览器可能有所不同,您还应该记住不要信任客户端生成的任何信息,也就是说,以下声明对我有效(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

  • 如果未提供参数,构造函数将根据系统设置创建当前日期和时间的 JavaScript Date 对象。
  • 笔记:当 Date 被作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要 UTC,请使用 new Date(日期.UTC(...))具有相同的参数。(笔记:Date.UTC() 返回自 1970-01-01 00:00:00 UTC 以来的毫秒数)

如之前的答案所述,添加 60000 * Date.getTimezoneOffset() 是不正确的。首先,出于显示目的,您必须将所有日期/时间视为带有时区修饰符的 UTC。

同样,浏览器可能有所不同,但是 Date.getTime() 返回自 1970-01-01 UTC/GMT 以来的毫秒数。如果您像上面那样使用此数字创建新日期,则它将是 UTC/GMT。但是,如果您通过调用 .toString() 显示它,它将显示为您的本地时区,因为 .toString() 使用您的本地时区,而不是调用它的 Date 对象的时区。

我还发现,如果您在某个日期上调用 .getTimezoneOffset() ,它将返回您的本地时区,而不是您调用它的日期对象的时区(但是我无法验证这是标准的)。

在我的浏览器中,添加 60000 * Date.getTimezoneOffset() 创建一个 DateTime 不是世界标准时间. 。但是,当在我的浏览器中显示时(例如:.toString() ),它会在我的本地时区中显示一个 DateTime,如果忽略时区信息,该日期时间将是正确的 UTC 时间。

var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

您想将日期转换成这样一个字符串?

我会做一个函数来做到这一点,而且,尽管它是稍有争议,将其添加到日期原型。如果你不舒服这样做,那么你可以把它作为一个独立的函数,将日期作为参数。

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};
getUTCFullYear,getUTCMonth,getUTCHours ...然后只需添加:

如果你需要它在UTC时间,刚好与getUTC *,如更换所有的get *函数“+00:00”结尾,而不是用户的时区偏移量。

date = '2012-07-28'; stringdate = new Date(date).toISOString();

应在最新的浏览器工作。它在Firefox 6.0返回2012-07-28T00:00:00.000Z

我的使用日期时的建议是解析日期到从用户输入的各个字段。你可以使用它作为一个完整的字符串,但你是在玩火。

JavaScript可以以不同的格式不同地对待两个相等的日期。

HTTPS://developer.mozilla。组织/ EN-US /文档/网络/的JavaScript /参考/ Global_Objects /日期/解析

决不做像什么:

new Date('date as text');

一旦你有你的约会解析成由用户输入的个人领域,创建一个日期对象。一旦创建日期对象将其转换为UTC通过添加时区偏移。我不能强调它是多么重要的是使用之日起物体的偏移由于DST(这是另一个讨论,但是说明为什么)。

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

现在,你可以通过日期在UTC时间服务器。再次,我会强烈建议不要使用任何的日期字符串。无论它传递到分解到你需要例如最低粒度服务器年,月,日,分或像从UNIX毫秒为单位的值。

如果你正在处理的日期了很多,这是值得使用moment.js( http://momentjs.com ) 。转换为UTC的方法将是:

moment(yourTime).utc()

您可以使用格式的日期改成你想要的任何格式为:

moment(yourTime).utc().format("YYYY-MM-DD")

有被抵消力矩选项,以及,但有一个附加的互补库用于与时区处理( HTTP:// momentjs的.com /时区/ )。时间转换将是像这样简单:

moment.tz(yourUTCTime, "America/New_York")

另一种解决方案,以转换为UTC和保持它作为一个日期对象: (它通过从所述格式化的字符串的末尾去除“GMT”部分,然后把它放回Date构造)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

我需要做这与日期时间选择器库接口。但总的来说这是一个坏主意,使用日期这种方式工作。

用户普遍希望在当地的时间与日期时间的工作,让你无论是更新服务器端代码正确解析与偏移日期时间字符串,然后转换为UTC(最好的选择),或者你之前转换为UTC字符串客户端(在威尔斯特恩的回答等)发送到所述服务器

我刚刚发现1.2.3版本的史蒂芬Levithan的 date.format.js 不正是我想要的。它可以让你提供一个格式字符串为JavaScript日期,并从本地时间转换为UTC。以下是我现在使用的代码:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

我已经找到了的jQuery插件全球化日期解析效果最好。其他方法有跨浏览器问题和类似的东西date.js没有在很长一段时间被更新。

您也不必在页面上一个datepicker。你可以只调用类似的东西在文档中给出的示例:

$.parseDate('yy-mm-dd', '2007-01-26');

此功能精美的作品对我来说。

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}

使用 moment.js UTC方法;

const moment = require('moment');
const utc = moment.utc(new Date(string));

这是我在过去所做的那样:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

查看您的问题,很明显您只想将日期范围发送到后端以进行进一步的后处理。

我假设您遵守标准数据指南,该指南期望数据采用特定格式。例如,我使用 ODATA,它是一个 RESTfull API,它期望日期时间对象采用以下格式:-

YYYY-MM-DDT00:00:00。

这可以通过下面发布的代码片段轻松实现(请根据您的要求更改格式)。

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

另一方面,如果您处于我的情况,您已从后端收到日期,并且浏览器会将其转换为您的本地日期。另一方面,您对 UTC 日期感兴趣,那么您可以执行以下操作:-

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

上面的代码片段基本上是根据时区添加/减去浏览器添加/减去的时间。

例如,如果我在 EST(GMT-5) 中,并且我的服务返回日期时间对象 = Wed Aug 17, 2016 00:00:00 GMT-0500 我的浏览器会自动减去时区偏移量(5小时)来获取我的当地时间。因此,如果我尝试获取时间,我会得到 Wed Aug 16 2016 19:00:00 GMT-0500。这会导致很多问题。有很多库肯定会让这变得更容易,但我想分享纯 JS 方法。

欲了解更多信息,请查看: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ 我从哪里得到灵感。

希望这可以帮助!

var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

这会给你正确的UTC日期和时间。结果 这是因为getTimezoneOffset()会给你在几分钟的时区差异。 我建议你不要使用toISOString()因为输出将在字符串中因此,在未来您将无法操纵日期

这个方法会给你:2017-08-04T11:15:00.000+04:30,你可以忽略变量简单地得到2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

如果您需要Date对象

仅传递日期字符串日期假定时间是00:00按时间区移位:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

如果您添加当前的小时和分钟你会得到正确的日期:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

使用瞬间包,您可以轻松地转换UTC的日期字符串到一个新的Date对象:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

这特别有助于当你的服务器不支持时区,并要始终将存储UTC日期在服务器和拿回来作为一个新的Date对象。上面的代码工作为我类似的问题,这个线程是的要求。这里共享,以便它可以帮助别人。我看不出究竟上述任何答案的解决方案。感谢。

我知道这个问题是旧的,但在看这个相同的问题,其中一个方案是发送date.valueOf()到服务器,而不是。的JavaScript日期的的valueOf()函数发送自午夜的毫秒数1970年1月1 UTC。

的valueOf()

所以这是我不得不这样做,因为我还是想一个JavaScript日期对象来操作的日期和unfortunantly很多的这些问题的答案需要你去到一个字符串的方式。

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

甚至更简单的结果

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top