Javascript解析日期

时间:2015-06-08 19:42:00

标签: javascript date

我正在编写MVC 5 Web应用程序。在这里,我有多个列表,我通过javascript和jquery传播和管理(一个数据集,依赖选择控件,添加ajax回调会使它不必要地复杂化。)

我遇到的问题是:我有一个隐藏的格式为ISO 8601的字段。当我在用户当地时间显示日期时遇到问题,我得到了转移日期。

因此,如果日期表示为:01-01-2009(iso 8601格式:2009-01-01),则用户会看到:12-31-2008。

当我使用以下内容解析日期时

this.date = new Date(Date.parse(originalString));
/* ^- Date.parse is giving me a number. */

显示我正在使用的日期的文本:

admin.date.toLocaleDateString().Concat(...

我是否需要进行任何类型的补丁调整以适应时区?使用console.log(admin.date);时的日期显示原始的2009-01-01

我认为我在toLocaleDateString中没有正确指定某些参数,但我对它的熟悉程度很低。

编辑:目标是防止日期转换。我们存储的所有内容都是日期,时间方面被删除。我们有多个时区发布到此数据库,目标是:我们使用发布它的人的日期,时间删除。如果是2015年5月1日的日期,我希望看到该日期的任何人看到2015年5月1日,' toLocaleDateString'仅仅是让它为其区域显示格式正确的一种方法。因此,将日期视为yyyy-mm-dd的人会正确地看到它。

1 个答案:

答案 0 :(得分:1)

基于Date.parse的文档:

  

Date.parse()方法解析日期的字符串表示形式,并返回自1970年1月1日00:00:00 UTC以来的毫秒数。

您正在以UTC的形式获取已解析日期字符串的纪元时间,因此当地时间的日期已关闭。因此,您需要知道Date.getTimezoneOffset提供的本地时间和UTC之间的时差(以分钟为单位),以便为当地时间设置正确的日期:

> var date = new Date(Date.parse('2009-01-01'));
undefined
> date;
Wed Dec 31 2008 19:00:00 GMT-0500 (EST)
> date.getTimezoneOffset();
300
> date.setMinutes(date.getTimezoneOffset());
1230786000000
> date;
Thu Jan 01 2009 00:00:00 GMT-0500 (EST)

有一点需要注意:

  

...如果当地时区落后于UTC,则偏移量为正,如果超前,则偏移量为负值。

因此,如果适用于您的应用程序,您可能需要注意值为负的区域设置。如果是这样,可能只是省略负值就足够了,因为如果区域设置的时区早于UTC午夜,则日期应该相同。

编辑:为了弥补夏令时的可能问题:

> var dateVals = String.prototype.split.call('2009-01-01', '-');
undefined
> var date = new Date(dateVals[0], dateVals[1] - 1, dateVals[2]);
undefined
> date
Thu Jan 01 2009 00:00:00 GMT-0500 (EST)