我想使用时刻或任何其他可能性获取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()
等)
答案 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()
等)
您不会呼叫getDate
或getFullYear
。这些功能在内部要求计算机的本地时区,并将其应用于时间戳,然后再确定其结果。相反,您会要求使用getUTCDate
或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));
这项技术称为1970-01-01T00:00:00.000Z
Unix时代转移(或移向)。在这种情况下,错误创建的是原始Date
对象(由选择器创建的对象),因此上述内容将其移回了标准Unix时代。
请记住,此技术就是让您的用户选择基于UTC的值,并将其返回给常规Date
对象。用来让您的用户选择一个本地值并将其转换为UTC是不是。为此,您必须使用为此目的设计的功能(getUTCFullYear
,getISOString
等)。
答案 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”,因为它仍在使用您的本地时区,但如果您的目标与我的目标相同(仅使用硬编码时区显示),那么这将起作用。