如何将JavaScript日期转换为UTC?


590

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

2009-1-1 to 2009-1-3

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

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

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

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


10
之所以重新启用它,是因为它对我来说是Google的热门搜索,并且较新的浏览器内置了对UTC日期字符串的支持。
jcomeau_ictx 2012年

4
我更新了接受的答案,以突出显示新的ECMAscript 5 toISOString()方法。参见stackoverflow.com/a/11957822/19112
dthrasher 2013年

5
所以在2015年,我不得不弄乱字符串的解析日期吗?荒谬!
工具包

2
当然有 您永远都不能依靠别人为您完成工作:-P至少直到世界停止使用时区并开始确定日期和时间为止。
Erenor Paz

4
最好是“ Stardates”。
Michael Daw

Answers:


370

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之间导航时区。


81
实际上,这会将日期对象转换为字符串,将无法对其进行进一步的日期操作
orszaczky

2
@TheRebel,给出的用例是他需要向服务器发送格式化的字符串。
Will Stern 2014年

28
@Will,您完全正确,但是-正如我假设的大多数观众一样-我是根据标题到达这里的,搜索将JS日期转换为UTC的常规日期,所以我认为在这里提及它很有用:)
orszaczky 2014年

4
使用此方法时要小心!它不会创建UTC日期-它将现有的日期数据按原样格式化为UTC格式,并为其指定“ Z”时区。99%的时候这是错误的!使用此方法之前,必须将日期转换为GMT时区!
user1944491

5
@ user1944491我认为这是不正确的。根据MDN文档,toISOString是否可以正确转换为UTC [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset同样在示例中,它们还显示了偏移量是在调用toISOString时说明的
FFF

560

简单而愚蠢

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);

85
我喜欢您的想法,并做了很多次使用的方法。function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
蒂姆(Tim)

21
我想得到UTC日期和时间的最短代码是通过跳出时区:new Date(new Date().toUTCString().substr(0, 25))
joelvh 2012年

17
请注意,getUTCMonth()返回0到11的值。因此,如果需要按数字而不是字符串的月份,则可以将值+1。
Talvi Watia 2012年

19
这是无稽之谈。新的日期将具有与您实际想要的值不同的值。只需使用now.toUTCSTring()而不是(错)now_utc.toString()
Bergi 2013年

22
我不会使用它-通过使用新的Date(),您可以获得浏览器的时区。在Chrome 29和IE10中,日期和时间似乎正确,但是时区设置为浏览器的时区,这可能会导致问题...
Sean

207

这是我的方法:

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

生成的utc对象并不是真正的UTC日期,而是将本地日期更改为与UTC时间匹配(请参见注释)。但是,在实践中它确实可以做到。


当我意识到可以Date.now()提供本地时间而不是UTC时间时,我正在研究该问题,而这种解决方案对我来说似乎是最简单的。至少在我想要UNIX时间而不是格式正确的字符串的情况下。(唯一的区别是,我乘以60 * 1000只是为了更加清楚:))
TimothéeBoucher 2012年

18
添加60000 * Date.getTimezoneOffset()不正确!首先,您必须将所有日期/时间都认为已经是UTC,并带有用于显示的时区修饰符。浏览器可能有所不同,但是,Date.getTime()返回自1970-01-01以来的毫秒数。如果使用此数字创建新日期,例如:new Date(Date.getTime()); 它将是UTC,但是当您显示它(例如:通过chrome dev工具控制台)时,它似乎是您的本地时区。
亚伦·霍夫曼

15
在我的浏览器中,这将创建一个不是UTC的DateTime。但是,当在浏览器中显示时,这会在我的本地时区中显示一个DateTime,如果忽略时区信息,那将是正确的UTC时间。
亚伦霍夫曼

知道,有趣的一点。让我们比较now.toString()utc.toString():有没有时区的变化,但时间的改变,这是完全不同的事情。但是,一种更干净的解决方案会更加复杂(我想是这样),并且只要不进一步处理时区,这种代码就可以在大多数情况下发挥作用。这让我想起了鸭拳:不同的东西,但表现得一样。另请注意,DrunkCoder的代码也存在相同的问题。
Gras Double

4
该答案说明了“历元移位”的另一种常见实现方式,该实现孤立地存在危险,因为它可能在DST过渡之类的边缘情况下失败。不建议。
马特·约翰逊

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

这很好。我只需要将源日期中的“-”替换为“ /”即可创建JavaScript日期,然后可以调用toISO()函数以获取正确的输出。
dthrasher

这很好。您还可以将结果输入jQuery $ .parseDate(...),以获取日期对象,该对象已移至UTC。
Brian Ellis 2010年

23

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

小提琴链接


所以这是伪造的UTC吗?我更改了本地日期,并成功将实际在PC时钟上看到的日期和时间提交到服务器。哇。无论如何,都比精简和解析要好
工具包

你也不必.toISOString(),你可以发送isoDate服务器
工具包

.toISOString()很简单直接,要弄清日期将是一个额外的步骤(isoDate不是一个函数)。
RollerCosta 2015年

您是否不需要添加偏移量而不是减去偏移量?请参阅stackoverflow.com/a/11964609/832230
Acumenus'4

@ABB如果当前时区偏移为+ ve,则应将其减去(在我们的情况下IST为+5:30),否则添加。
RollerCosta

18

浏览器可能有所不同,并且您还应该记住不要信任客户端生成的任何信息,也就是说,以下声明对我有用(Mac OS X 10.8.2上的Google Chrome v24)

var utcDate = new Date(new Date().getTime());


编辑:“这与刚才new Date()有何不同?” 参见此处:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

  • 如果未提供任何参数,则构造函数将根据系统设置为当前日期和时间创建一个JavaScript Date对象。
  • 注意:如果将Date用作具有多个参数的构造函数,则指定的参数表示本地时间。如果需要UTC,请使用带有相同参数的新Date(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()创建一个不是UTC的DateTime 。但是,当显示在我的浏览器中(例如:.toString())时,它将在我的本地时区中显示一个DateTime,如果忽略时区信息,则它是正确的UTC时间。


11
我只是在Fx和Chrome上运行了这段代码,它似乎无法正常工作:结果与from完全相同new Date(),时间戳和时区均未更改
Gras Double

3
这是因为时间戳是无时区的。new Date().getTime()将始终返回与时区无关的时间戳。除非您尝试将其格式化为自Unix时代以来的毫秒数,否则没有与之相关的时间戳。
frontendbeauty

7
据我所知,new Date(new Date().getTime())返回值与完全相同new Date()。您能从什么意义上解释您的答案提供与众不同的价值new Date()
Kirk Woll

我将此值发布到服务器上new Date("5/19/2014").getTime()。Date构造函数创建的日期偏移量为+7。在服务器(C#)上,我将发布的值(以毫秒为单位)添加到unix epoch new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)。结果是5/19/2014 7:00:00 AM。因此,似乎getTime()给出了毫秒数,包括我的UTC偏移量。
xr280xr 2014年

1
有很多评论抱怨这new Date(new Date().getTime())行不通。我可以确认new Date(Date.UTC(2019, 8, 27, 0, 0, 0))确实会产生UTC时间。如果您无法使用,Date.UTC(...)您将获得时区中以UTC偏移量表示的日期。
亚历克斯·巴克

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

1
日期对象实际上需要设置为日期。以上只是一个例子。
James Skidmore

5
现在返回“星期四,2009年6月4日格林尼治标准时间”,这不是OP中要求的ISO格式。
尼克

4
这将它变成字符串,而不是日期
Anthony

2
不,实际上,根据OP,它应该是日期的字符串表示形式。
jcomeau_ictx 2012年

3
在转换为UTC后,它返回字符串格式,那么如何)访问方法,如得到月(),GETDATE(等
桑迪普沙

10

转换为UTC并将其保留为日期对象的另一种解决方案:(它的工作方式是从格式化字符串的末尾删除“ GMT”部分,然后将其放回Date构造函数中)

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

我需要执行此操作以与日期时间选择器库交互。但是总的来说,以这种方式处理日期是个坏主意。

用户通常希望在其本地时间使用日期时间,因此,您要么更新服务器端代码以正确解析带有偏移量的日期时间字符串,然后转换为UTC(最佳选项),要么在转换为UTC字符串客户端之前将其发送到服务器(如Will Stern的回答)


7

您是否正在尝试将日期转换成这样的字符串?

我会做一个函数来做到这一点,尽管有点争议,但是将它添加到Date原型中。如果您不愿意这样做,则可以将其作为独立函数,将日期作为参数传递。

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
    ;
};

如果您在UTC时间需要它,只需将所有get *函数替换为getUTC *,例如:getUTCFullYear,getUTCMonth,getUTCHours ...,然后在末尾添加“ +00:00”,而不是用户的时区偏移量。


1
这是我见过的第一个尝试处理时区偏移的示例,因此将其设置为+1。但是,我发现有一些问题-temp.substr(-2)会导致错误,因为它是一个数字,而不是字符串,因此您需要执行“ temp =''+ temp;”之类的操作。首先,将其转换为字符串。另外,我更喜欢ISO日期零填充-我认为这使它们更加标准。
米克·塞尔

@Mick-我已更新修复此错误。String(temp)自从最近以来,我一直在使用另一种方法("" + temp)报告为JSLint错误。
尼克


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

应该可以在大多数较新的浏览器中使用。它2012-07-28T00:00:00.000Z在Firefox 6.0上返回


7

对于日期,我的建议是将日期解析为来自用户输入的各个字段。您可以将其用作完整字符串,但是您正在玩火。

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

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

永远不要做类似的事情:

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纪元的毫秒数。



6

如果您要处理大量日期,则值得使用moment.js(http://momentjs.com)。转换为UTC的方法是:

moment(yourTime).utc()

您可以使用格式将日期更改为所需的任何格式:

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

目前还提供偏移选项,但还有一个用于处理时区的附加补充库(http://momentjs.com/timezone/)。时间转换将像这样简单:

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

moment(yourTime).utc()和 之间有什么区别moment.utc(yourTime)?我通常使用后者。
ps0604 '18年

5

无论在客户端设置什么时区,我的解决方案都可以使日期保持不变。也许有人会发现它有用。

我的用例:

我正在创建一个待办事项应用程序,您可以在其中设置任务的日期。无论您处于哪个时区,该日期都应保持不变。

例。您想在6月25日上午8点给您的朋友打电话。

您在中国之前(6月20日)的5天创建此任务。

然后,在同一天,您将飞往纽约几天。

然后在6月25日,当您仍在纽约时,您将在上午7:30醒来(这意味着您应该在30分钟内收到任务通知(即使在中国创建时已经是下午1:30)任务)

因此,任务是忽略时区。这意味着“我想在我所处的任何时区都在上午8点做”。

我要做的是说“我假设您一直在伦敦时区-UTC”。

意思是-当用户在他/他的时区中选择某个日期时,我将此日期转换为UTC中的相同日期。即。您在中国选择上午8点,但我将其转换为UTC的上午8点。

然后-下次您打开该应用程序时-我会读取保存在UTC中的日期并将其转换为当前时区中的同一日期-例如。我将UTC的上午8点转换为纽约时区的上午8点。

此解决方案意味着日期可能会具有其他含义,具体取决于您在设置日期和在何处阅读日期,但是日期保持不变,就像您总是处在同一时区一样。

让我们写一些代码:

首先-我们有2个主要功能,可在不考虑时区的情况下进行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
}

4

我刚刚发现Steven Levithan的date.format.js 1.2.3版本可以满足我的要求。它允许您提供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'); 

9
这似乎不是您问题的最佳答案。您应该重新考虑可以直接回答您的问题或以其他方式提出您的问题的事物。
hitautodestruct

1
我碰巧正在修复这个确切的脚本(和版本),因为它不足以支持IE7和Firefox。
巴巴拉萨(Barbarrosa)2012年

4

我发现jQuery全球化插件日期解析最有效。其他方法存在跨浏览器的问题,并且诸如date.js之类的东西已经很长时间没有更新了。

您也不需要页面上的datePicker。您可以调用类似于文档中给出的示例的内容:

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

1
仅仅因为某些内容尚未更新,并不意味着您不应该使用它。Date.js已经运行了好多年,因此不需要更新。JS Date对象和使用的日期格式在过去几年中没有发生变化,那么为什么要操纵它们的脚本呢?Date.JS绝对是那里最好的JS Date库。github中有一些问题,但除此之外,它是完美的。github.com/datejs/Datejs
thugsb 2012年

3

此功能对我来说效果很好。

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


2
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()因为输出将在字符串中,因此将来您将无法操纵日期


2

这是我过去所做的:

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

2

如果需要日期对象

仅传递日期字符串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)

1

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

我假设您符合标准数据准则,该准则要求数据采用特定格式。例如,我使用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)中,并且我的服务返回日期时间对象= 2016年8月17日星期三GMT-0500,则我的浏览器会自动减去时区偏移量(5小时)以获取我的本地时间。因此,如果我想获取时间,我会在2016年8月16日星期三19:00:00:00 GMT-0500。这引起很多问题。那里有很多库肯定会让这变得更容易,但是我想分享纯JS方法。

有关更多信息,请访问:http : //praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/我在哪里得到我的灵感。

希望这可以帮助!


1

此方法将为您提供:2017-08-04T11:15:00.000+04:30并且您可以忽略zone变量以简单地获取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;
}

1

使用即时包,您可以轻松地将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对象获取时,这特别有用。上面的代码满足了我对此线程用于类似问题的要求。在这里分享,以便对他人有所帮助。我在任何答案中都看不到上述解决方案。谢谢。


4
即使这可以回答问题,也不会解释您的代码。请更新您的答案以提供您所做的解释。谢谢!
Miroslav Glamuzina '19


0

我知道这个问题很旧,但是正在研究同样的问题,一种选择是改为将date.valueOf()发送到服务器。javascript日期的valueOf()函数发送自1970年1月1日午夜以来的毫秒数。

的价值()


0

所以这就是我必须这样做的方法,因为我仍然希望将JavaScript date对象作为日期进行操作,不幸的是,很多答案都要求您使用字符串。

//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 

0

加纱力矩

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

更简单

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
这是不完整的。 setTime依赖new Date,您未包括在内。请使答案完整。
random_user_name 2012年

这个人还活着吗?为什么甚至不返回我们,说些什么或编辑答案呢?
绝望
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.