在JavaScript中获取UTC日期(不是UTC字符串)

时间:2019-09-05 17:29:50

标签: javascript momentjs utc

我想使用时刻或任何其他可能性获取utc日期。 utcString = moment.utc(someDate)).format()给utc字符串而不是utc日期。我无法使用此功能执行类似utcString.getDate()之类的操作。请帮助我提供utc日期对象。

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

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

7 个答案:

答案 0 :(得分:2)

Date对象上的the MDN Documentation

  

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

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

Date对象的许多功能可以通过不同的方式来显示该值,例如,以标准字符串格式,人类可读的字符串格式或代表部分分量值的各种其他数字(即年,月,日,小时,分钟,秒,毫秒)。其中一些功能在确定其输出时使用UTC(例如.toISOString().getUTCFullYear()等),其他功能在确定其输出时使用计算机的本地时区(例如.toString().getFullYear()等。

很容易对此感到困惑,尤其是如果直接在console.log对象上调用Date时。需要记住的是,控制台日志记录功能是特定于实现的。您可能会看到一个类似于本地时间的人类可读字符串,就好像您调用了.toString(),但是某些实现为您提供了一个类似于ISO格式的UTC时间的字符串,就好像您调用了.toISOString()。实际上,实现可以在记录日志时做任何想要的事情。它可以打印出a hissing cat

更令人困惑的是,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中的要求。

  

我希望将类似"2019-10-31T00:00:00.000Z"的utc格式的字符串转换为utc日期并执行操作(例如getDate()getFullYear()等)

您不会呼叫getDategetFullYear。这些功能在内部要求计算机的本地时区,并将其应用于时间戳,然后再确定其结果。相反,您会要求使用getUTCDategetUTCFullYear,它们不应用本地时区。

  

...实际上,我正在使用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));

这项技术称为 epoch shifting ,因为它可以将时间戳的基础从(或朝着)1970-01-01T00:00:00.000Z Unix时代转移(或移向)。在这种情况下,错误创建的是原始Date对象(由选择器创建的对象),因此上述内容将其移回了标准Unix时代。

请记住,此技术就是让您的用户选择基于UTC的值,并将其返回给常规Date对象。用来让您的用户选择一个本地值并将其转换为UTC是不是。为此,您必须使用为此目的设计的功能(getUTCFullYeargetISOString等)。

答案 1 :(得分:1)

您可以使用JS Date类。

创建日期实例:let date = new Date();

然后,您可以对该日期对象执行很多功能。例如,

let d= new Date();
d.getDate()
//5

答案 2 :(得分: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);
<script src="https://momentjs.com/downloads/moment.js"></script>

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

答案 3 :(得分:0)

JavaScript date对象具有用于获取UTC日期,年份,字符串等的函数。您可以找到所有不同的函数here。示例:

graph = {'A': ['B', 'C', 'E'],
         'B': ['A','D', 'E'],
         'C': ['A', 'F', 'G'],
         'D': ['B'],
         'E': ['A', 'B','D'],
         'F': ['C'],
         'G': ['C']}
def undirected_graph(graph,start,stop):
    visited = []
    queue = [start]
    if start == stop:
        print("Woah we ended before even starting!")
    else:
       while queue:
        path = queue.pop(0)
        node = path[-1]
        if node not in visited:
            visited.append(node)
            neighbours = graph[node]
            for neighbour in neighbours:
                new_list = list(path)
                new_list.append(neighbour)
                queue.append(new_list)
                if neighbour == stop:
                    print("We reached the end")
                    return new_list
undirected_graph(graph,'A','G')

答案 4 :(得分:0)

您可以通过执行以下有趣的操作来避免使用额外的库:

var fooDate = new Date();
var utcDay = fooDate.getUTCDate();
fooDate.setDate(utcDay);

这将使您获得UTC日期并使用它更新您已经存在的Date对象。

编辑:我建议您也检查Jesse的答案,以防您需要UTC格式的整个内容。

答案 5 :(得分:0)

要将"2019-10-31T00:00:00.000Z"转换为Date对象,可以尝试使用new Date()。从那里,您将能够调用诸如getFullYear或getUTCString之类的方法:

new Date("2019-10-31T00:00:00.000Z").getFullYear()

如果您想使用moment.js,则可以使用moment.toDate()获得本地日期。然后,您可以在本地日期调用getFullYear()等。

let time = moment.utc(new Date("2019-10-31T00:00:00.000Z"))
let UTCDate = time.toDate().getFullYear()

如果您想用Date代表当前时间,只需致电new Date()

答案 6 :(得分:0)

我没有使用任何外部库,就我而言,我有一个硬编码文本“UTC”:

(即 We will delete your account at ${tomorrowUtc} UTC

所以这就是我所做的:

const now = new Date();
const year = now.getUTCFullYear();
const month = now.getUTCMonth();
const day = now.getUTCDate();
const hour = now.getUTCHours();

const tomorrowUTC= new Date();
tomorrowUTC.setDate(day + 1); // +1 because my logic is to get "tomorrow"
tomorrowUTC.setYear(year);
tomorrowUTC.setMonth(month);
tomorrowUTC.Hours(hour);

// then use the tomorrowUTC for to display/format it
// tomorrowUTC is a "Date" and not a string.

这有点“hacky”,因为它仍在使用您的本地时区,但如果您的目标与我的目标相同(仅使用硬编码时区显示),那么这将起作用。