get UTC date (not UTC string) in javascript

qaz*_*qaz 6 javascript utc momentjs

I want to get utc date using moment or any other possibilities. utcString = moment.utc(someDate)).format() is giving utc string not utc date. I am not able to perform operations like utcString.getDate() , etc using this. Please help me in providing with utc date object.

moment.utc(new Date()).toDate() 正在将日期再次转换为我的当地时间。

例如:我希望将 utc 格式的字符串"2019-10-31T00:00:00.000Z"转换为 utc 日期并执行getDate(), getFullYear()可以使用 Date() 对象执行的操作(如等)

Mat*_*int 7

该文件MDN上的Date对象:

创建一个 JavaScriptDate实例,以独立于平台的格式表示单个时刻。Date对象包含Number表示自 UTC 1970 年 1 月 1 日以来的毫秒数。

换句话说,Date对象只是一个包含单个值的抽象,并且该值始终以 UTC 表示。如果您想查看该值,请调用.valueOf().getTime(),或将其强制为数字(例如:+d)。

Date对象的许多特征可以以不同的方式公开该值,例如以标准化的字符串格式、人类可读的字符串格式或表示部分组件值的各种其他数字(即年、月、日、小时、分、秒、毫秒)。其中的一些功能使用UTC确定其输出时(如.toISOString().getUTCFullYear()等),以及其他确定它们的输出时所使用的计算机的本地时区(如.toString().getFullYear()等)。

很容易对此感到困惑,尤其是在console.log直接调用Date对象时。需要记住的是,控制台日志记录功能是特定于实现的。您可能会看到一个人类可读的字符串,它看起来像本地时间.toString(),就像您调用.toISOString(). 确实,实现可以在日志记录方面做任何想做的事情。它可以打印出一只发出嘶嘶声的猫

更令人困惑的是,Date构造函数根据本地时间获取其数字参数,因此人们可能认为它new Date(2019,8,5,0,0,0)Date本地时间的对象,但实际上它在构造过程中转换为 UTC 并记录相应的时间戳。可以通过new Date(Date.UTC(2019,8,5,0,0,0))将这些值解释为 UTC,但无论哪种方式Date对象本身都是 UTC

关键的一点是,不要以为因为你看到的本地时间,该Date物体是本地时间。不是。它从来都不是。因此,在不同的时区请求它也是不可能的。在 UTC 中要求它是你已经拥有的。

我要像UTC格式的字符串"2019-10-31T00:00:00.000Z"即可转换为UTC日期和执行操作(如getDate()getFullYear()等)

你不会打电话getDategetFullYear。这些函数在内部询问计算机的本地时区并将其应用于时间戳,然后再确定其结果。相反,您会调用getUTCDateor getUTCFullYear,它不适用本地时区。

...实际上我正在使用react-date-picker。... (来自您的评论)

那里有很多日期选择器。如果您没有从正在使用的功能中获得功能,请尝试另一个。

在时区方面,最好的人会做两件事之一:

  • 他们可能会为选择器的“模式”提供设置,通常是本地或 UTC,或者可能是特定的 UTC 偏移量或时区 ID。这将允许您预先确定您希望选择器在其输入和输出方面的行为方式。

  • 他们可能只是将输入和输出作为 提供String,而不是作为Date对象。这将允许选择器以中立的方式运行,然后您可以以您喜欢的任何方式解释用户的选择。(顺便说一句,HTML5 就是<input type="date">这样工作的。)

不幸的是,有很多日期选择器不能以这种方式工作,并且假设您只是想要一个Date基于本地时间创建的对象。为了解决这个问题,你需要撒一点谎。

例如,假设我2019-09-05从假定我的本地时区的日期选择器中进行选择。它在内部进行new Date(2019, 8, 5),或者可能确实如此new Date("2019-09-05T00:00:00.000")。在Date对象记录相应的时间戳值之前,任何一种形式都将被解释为本地时间。但我实际上并不想要——我想让用户选择一个 UTC 日期。所以我添加了这段代码来调整d从选择器返回的对象 ( ):

d.setTime(d.getTime() - (d.getTimezoneOffset() * 60 * 1000));
Run Code Online (Sandbox Code Playgroud)

这种技术称为纪元转移,因为它将时间戳的基础移离(或朝向)1970-01-01T00:00:00.000ZUnix 纪元。在这种情况下,它Date是错误创建的原始对象(由选择器创建的对象),因此上述将其移回标准 Unix 时代。

请记住,这项技术就是让您的用户选择一个基于 UTC 的值,然后将其恢复为常规Date对象。它用于让您的用户选择本地值并将转换为 UTC。对于您必须使用专为目的(的功能getUTCFullYeargetISOString等等)。


Mar*_*ciu 0

let d = moment();
let d_utc = moment.utc();
let full_year = d_utc.format('YYYY');
let month = d_utc.format('MM')
console.log(d);
console.log(d_utc);
console.log(d.format());
console.log(d_utc.format());
console.log(full_year);
console.log(month);
Run Code Online (Sandbox Code Playgroud)
<script src="https://momentjs.com/downloads/moment.js"></script>
Run Code Online (Sandbox Code Playgroud)

您可以根据需要设置日期格式(当地时间或 UTC)并将结果放入变量中。