65

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

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

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

4

7 回答 7

84

这是 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/

于 2015-12-31T03:19:16.523 回答
24

不幸的是,没有一个很好的解决方案。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。参考在这里

最后,您可能需要考虑仅使用纯 JavaScript 将时间字符串中的小时和分钟解析为数字。根据需要操作数字,然后再次输出字符串。但是您的问题似乎是您正在寻找更受管理的东西。

于 2013-07-27T19:11:56.433 回答
21

我最终使用了以下内容,因为我已经moment在我的应用程序中使用了:

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

有关您可以使用的其他格式字符串,请参阅Moment String+Format 文档

于 2015-09-16T03:17:19.773 回答
2

我最近不得不为一个项目这样做,但实际上并不需要包含moment.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 语法。

于 2017-12-07T02:48:25.783 回答
1

好的,所以我知道我参加派对要迟到了。就像晚了 6 年,但这是我需要弄清楚并将其格式化为 HH:mm:ss (24 小时)。

moment().format(moment.HTML5_FMT.TIME_SECONDS); // 17:44:56

您还可以传入一个参数,如2019-11-08T17:44:56.144.

moment('2019-11-08T17:44:56.144').format(moment.HTML5_FMT.TIME_SECONDS); // 17:44:56

https://momentjs.com/docs/#/parsing/special-formats/

于 2019-11-09T02:03:43.973 回答
1

而且我知道我迟到了 8 年以上,但值得注意的是,它moment.js不再被开发并且正在使用起搏器进行维护。他们实际上不建议将 moment.js 用于新应用程序。

在这里可以找到更多详细信息:https ://momentjs.com/docs/

于 2021-10-21T01:00:29.520 回答
0

我知道我是在 8 年后写这篇文章,但现在不再建议使用 moment.js 库,因为它不再受支持,luxo.js 是首选(如moments.js 的演变),您可以在此处找到更多信息:https://moment.github.io/luxon/api-docs/index.html

于 2021-10-23T08:56:36.347 回答