JavaScript的UTC日期转换

问题描述:

我有一个函数,我传递一个日期字符串,我需要确定如果提供的日期是基于当前的UTC日期过去。JavaScript的UTC日期转换

我认为我的问题来自dateToUTC函数,因为它返回的是UTC上午7点的日期,currentUTC给了我全部时间戳。

这几乎就像我需要追加hh/mm/ss到我提供的日期的结尾以检查?

有关我如何调整它的任何想法?

// I expect this to return false since the UTC DATE is not 08/17/2017 
alert(isHistoricalChange('08/16/2017')) 

/** 
* Determine if the start date supplied is in the past 
*/ 
function isHistoricalChange(startDate){ 
    // dateToUTC(startDate) = 1502866800000 
    // currentUTC() = 1502903243386 
    return (dateToUTC(startDate) < currentUTC()); 
} 


/** 
* Returns the current timestamp in UTC 
*/ 
function currentUTC() { 
    return Date.now(); 
} 


/** 
* Returns timestamp in UTC based on date supplied 
*/ 
function dateToUTC(d) { 
    return new Date(d).getTime(); 
} 

小提琴:http://jsfiddle.net/981ats14/

+0

你应该考虑使用像[Moment.js](http://momentjs.com/)这样的处理时间,所以你不必这样做。 –

+0

@SumnerEvans - 你有没有例子说明我可以用这个库来完成这个任务? – SBB

+0

你可以很容易地从两个“时刻”对象http://momentjs.com/docs/#/displaying/difference/中获得差异。我建议只看文档,看看它提供什么,看看它是否与你想要完成的内容相符。我个人以前没有用过,但我听说它是​​一个很好的图书馆。 –

我不确定你想要做什么。如果您希望将“08/16/2017”(我假设它是2017年8月16日)解析为UTC,然后查看它是否在当前日期之前,那么您可以使用简单的解析函数。

由于Date对象是UTC,所以当前“UTC日期”由new Date()提供。用于计算当前UTC时间的主机时区设置,通常由toStringtoLocaleString方法返回主机时区中的日期和时间。但是Date对象中的基础值是UTC。

所以,你可以解析 “2017年8月16日” 为UTC,只是把它比作新的Date()

function parseMDYasUTC(s) { 
 
    var b = s.split(/\D/); 
 
    return new Date(Date.UTC(b[2], b[0]-1, b[1])); 
 
} 
 

 
var d = parseMDYasUTC('08/16/2017') 
 
console.log('2017-08-16 parsed as UTC:\n' + d.toString() + 
 
      ' or \n' + d.toISOString()); 
 

 
console.log('Is "08/16/2017" UTC before today? ' + 
 
      (parseMDYasUTC("08/16/2017") < new Date()));

字符串“2017年8月16日“应该由内置解析器解析为UTC,然而字符串解析是非常不可靠的,所以总是手动解析字符串。图书馆可以提供帮助,但一个简单的功能通常就足够了

您错误地创建一个Date对象。你应该像这样调用你的函数:alert(isHistoricalChange('2017-8-17'))

下面是日期构造函数的例子:

var today = new Date(); 
var birthday = new Date('December 17, 1995 03:24:00'); 
var birthday = new Date('1995-12-17T03:24:00'); 
var birthday = new Date(1995, 11, 17); 
var birthday = new Date(1995, 11, 17, 3, 24, 0); 

要了解更多: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

+0

我看不出这是如何回答问题的。 – RobG

+0

他的逻辑工作正常,但在我看来,OP正试图输入格式不正确的日期。如果他通过“2017-08-17”而不是“08/16/2017”,那么他的片段完全按照预期工作。 – manpozi

正如你已经猜到,currentUTC被返回当前日期时间,而不只是日期。你可以像这样修改它以获得一天的开始:

function currentUTC() { 
    const d = new Date(); 
    d.setHours(0, 0, 0, 0); 
    return d.getTime() 
}