2013-07-26 248 views
25

我需要在我的代码中解析和操作没有日期的时间。例如,我可能会从时间选择器中得到字符串“15:00”。我想将它变成某种时间对象 - 我通常使用具有不同日期,时间和日期时间对象的Python工作。Javascript解析没有日期的时间

但是我看到的所有解决方案都集中在使用Date对象。由于需要日期信息,因此无法解析像“15:00”这样的字符串。我不想将任意日期信息添加到时间 - 特别是因为日期似乎根据日期和区域设置对夏令时等进行了假设,并且似乎存在自动尝试将时间转换为给定语言环境。此外,我希望能够增加时间,例如“15:00 + 1小时”

解析和处理与日期无关的“原始”时间的建议解决方案是什么?

+0

如果您不想编写自己的代码来完成此操作,可以使用[Moment.js](http://momentjs.com)或[Date.js](http://www.datejs.com) 。 – Pointy

+0

我建议你自己写几行你需要的东西。由于没有日历问题,这很简单。 –

+0

这就是我希望避免的。 Moment.js和Date.js都关注日期时间,而不是时间,因此在使用它之前,您仍然必须将任意日期信息粘贴到时间。我可以想象它的实施并不复杂,但我很惊讶这已经不存在了。 – mangecoeur

回答

13

不幸的是,没有一个好的解决方案。 JavaScript只有一个Date对象,因为它真的是日期+时间,所以可能会错误地命名。你可能要考虑更深层次的

一两件事 - 你说你要只有上班时间,但你的意思是一个时间的日或你的意思的时候一个时间?这是两个相关的概念,但略有不同。

例如,你说你可能想要一个像“15:00 + 1小时”的操作。那么明显是16:00这两种方式。但是“15:00 + 10小时”呢?如果你谈论的是持续时间,那将是25:00,但如果你正在谈论时间,那么可能是01:00。

实际上,它可能是而不是是01:00,因为并非所有的日子都有24小时在其中。有些日子有23,23.5,24.5或25小时,这取决于什么时区以及DST是在当天开始还是停止。因此,在时间环境下,您可能需要在计算中包含特定的日期和区域。当然,如果你谈论的是24小时连续的日子,那么这一点是无关紧要的。

如果你正在谈论持续时间 - 你可能想再次看看moment.js,但不在moment对象。这里还有另一个对象,moment.duration。参考是here

最后,您可能需要考虑仅使用普通javascript将时间字符串的小时和分钟解析为数字。根据需要操作数字,然后再输出一个字符串。但是,你的问题似乎是你正在寻找更多的管理。

+0

不幸的是,我正在寻找“时间”而不是持续时间(所以moment.js已经出来)。它看起来像没有管理的解决方案,我不得不使用正则表达式字符串解析 - 这是一个耻辱,因为这是一种容易产生微妙的错误,我喜欢由一个经过良好测试的库处理的那种烦人的东西。 – mangecoeur

+0

如果你可以在某一天放置那个时间,那么'日期'或'时刻'仍然是一个好主意。如果它总是被分开(比如一周中每天的餐厅开放时间),边缘案例更具挑战性。我不知道有任何好的js库。抱歉。 –

14

我结束了,因为我已经在我的应用程序中使用moment使用以下物质:

var str = '15:16:33'; 
var d = new moment(str, 'HH:mm:ss'); 

你可以使用其他格式的字符串见Moment String+Format docs

29

下面是12或24小时次moment.js解决方案:

moment('7:00 am', ['h:m a', 'H:m']); // Wed Dec 30 2015 07:00:00 GMT-0600 (CST) 
moment('17:00', ['h:m a', 'H:m']); // Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 
moment('17:00 am', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 
moment('17:00 pm', ['h:m a', 'H:m']);// Wed Dec 30 2015 17:00:00 GMT-0600 (CST) 

http://momentjs.com/docs/#/parsing/string-formats/

+2

我一直在寻找这一整天 –

+0

哇......这就是它!基本上,我的(也可能是OP的)用例的日期时间并不重要。只需要将时间字符串转换为有效的momentjs对象。并认为网络上的所有其他帖子都提到了这种“不幸”和“不可能”的嘿嘿。谢谢!! –

1

我不得不为一个项目最近做,但真正地没有需要包括的时刻。JS,我采用的方法是手动分析的时候是这样的:

function parseTime(time) {  
    let timeInt = parseInt(time); 
    let minutes = time.substring(3,5); 

    // you could then add or subtract time here as needed 

    if(time > '12:00') { 
     return `${timeInt - 12}:${minutes} PM`; 
    } else { 
     return `${timeInt}:${minutes} AM`; 
    } 
} 

使用此作为替代启动,如果你不想用的时刻。注意这个例子使用es6语法。