如何仅在javascript中输入字符串未提供时应用默认时区?

如何仅在javascript中输入字符串未提供时应用默认时区?,javascript,node.js,timezone,date-parsing,Javascript,Node.js,Timezone,Date Parsing,我正在尝试编写一个函数,该函数将时间戳字符串作为输入(与javascriptDateclass构造函数的格式相同),并返回从纪元开始的毫秒数。如果时间戳中未指定时区,则应使用UTC作为默认时区。基本上,我想要以下内容,但带有默认时区: (input) => new Date(input).valueOf(); 主要问题是格式太多。对于我来说,有太多可能的方式来格式化一个日期,以编写一个我可以信赖的时区解析器。甚至可能有一些我不知道的格式 我试图利用Date类中已经使用的解析器,但是如果我

我正在尝试编写一个函数,该函数将时间戳字符串作为输入(与javascript
Date
class构造函数的格式相同),并返回从纪元开始的毫秒数。如果时间戳中未指定时区,则应使用UTC作为默认时区。基本上,我想要以下内容,但带有默认时区:

(input) => new Date(input).valueOf();
主要问题是格式太多。对于我来说,有太多可能的方式来格式化一个日期,以编写一个我可以信赖的时区解析器。甚至可能有一些我不知道的格式

我试图利用
Date
类中已经使用的解析器,但是如果我使用构造函数,我无法判断生成的时区是由于在时间戳中指定的,还是默认的

new Date('2020-11-11 00:00').valueOf() === new Date('2020-11-11 00:00+02:00').valueOf(); // May be true or false depending on the local timezone
我尝试使用
时刻时区
。它公开了一个
setDefault
方法,但它的工作方式不一致:

import moment from 'moment-timezone'; // 0.5.27

moment.tz.setDefault('UTC');
moment('2020-11-11').valueOf(); // 1605052800000
moment('2020-11-11 UTC').valueOf(); // 1605052800000
moment('Nov 11 2020').valueOf(); // 1605045600000 <-- expected 1605052800000 instead. Likely affected by local timezone.
moment('Nov 11 2020 UTC').valueOf(); // 1605052800000
从“时刻时区”导入时刻;//0.5.27
矩.tz.setDefault('UTC');
力矩('2020-11-11')。值();//1605052800000
力矩('2020-11-11 UTC')。valueOf();//1605052800000

力矩('2020年11月11日')。valueOf();//1605045600000您需要更具体地说明希望支持哪些格式。如果您希望解析任何可能是日期的内容,很抱歉,您运气不好。为什么?因为你可能会遇到类似于
1/2/2020
的情况,你不知道它代表的是1月2日还是2月1日。@MattJohnson Pint这是一个很好的观点。当然,我们不可能什么都有。我的意思是支持
Date
类构造函数支持的相同格式,因此
1/2/2020
将在1月2日发布。我将编辑这个问题以包含这个假设。根据ECMAScript规范,
Date
构造函数支持。其他任何内容都是特定于实现的,并且在不同的浏览器中差异很大。特别是,大多数浏览器将使用特定于区域性的解释。这意味着一些用户将看到
新日期(“2020年1月2日”)
解释为1月2日,一些用户将看到2月1日,一些用户将看到
无效日期
错误。简而言之,你不能依靠
Date
对象来解析特定于区域性的格式。我认为这是一个可以接受的答案(暗示)。我想我必须定义一组我支持的格式并解析它们,而不是追求任何通用的解决方案。