Javascript解析不带日期的时间

Javascript parsing Times without Date

本文关键字:日期 时间 Javascript      更新时间:2023-09-26

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

然而,我看到的所有解决方案都集中在使用Date对象上。这无法解析像"15:00"这样的字符串,因为它需要日期信息。我不想在《泰晤士报》中添加任意的"日期"信息,尤其是因为"日期"似乎会根据日期和地区对夏令时之类的事情做出假设,而且它似乎有自动尝试将时间转换为给定地区的风险。此外,我希望能够添加时间,例如"15:00+1小时"

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

这里有一个适用于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/

不幸的是,没有一个好的解决方案。JavaScript只有一个Date对象,因为它实际上是一个日期+时间,所以可能被误名了。

你可能想更深入地思考一件事——你说你只想用时间工作,但你是指一天中的时间还是指持续时间

例如,您说您可能想要一个类似"15:00+1小时"的操作。不管怎样,那显然是16:00。但是"15:00+10小时"呢?如果你谈论的是持续时间,那可能是25:00,但如果你谈论一天中的时间,那也可能是01:00。

事实上,这可能不是01:00,因为并非所有的日子都有24小时。有些日子有23、23.5、24.5或25小时,这取决于时区以及夏令时当天是开始还是结束。因此,在一天中的时间上下文中,您可能确实希望在计算中包含特定的日期和区域。当然,如果你说的是24小时工作制,那么这一点就无关紧要了。

如果您谈论的是持续时间,您可能需要再次查看moment.js,但不要查看moment对象。那里还有另一个对象,moment.duration。参考资料在这里。

最后,您可能需要考虑使用纯javascript将时间字符串中的小时和分钟解析为数字。根据需要对数字进行操作,然后再次输出字符串。但你的问题似乎是在寻找更有效的方法。

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

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

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

我知道我参加这个聚会已经晚了8年多,但值得注意的是,moment.js已经不再开发,正在使用起搏器进行维护。实际上,他们并不建议在新应用程序中使用moment.js。

更多详细信息请点击此处:https://momentjs.com/docs/

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

好吧,我知道我参加聚会迟到了。大约晚了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/

我们知道JavaScript中的Date类必须始终包含date,仅输入time是不够的。

但当被问到时,我不需要输入日期。这可能意味着:

  • 你打算把两个日期相互比较一下
  • 这两个日期是同一天

如果是这样,那么作为一个技巧,您可以将特定日期(任何日期)作为字符串添加到您的时间中。(例如0000-01-01

例如,此代码不正确:

var d1 = '00:53:57.123';
var d2 = '00:53:58.124';
console.log(new Date(d2).getTime() - new Date(d1).getTime());
//result: NaN

但这样你就可以得到正确的结果:

var d1 = '00:53:57.123';
var d2 = '00:53:58.124';
d1 = '0000-01-01 ' + d1;
d2 = '0000-01-01 ' + d2;
console.log(new Date(d2).getTime() - new Date(d1).getTime());
//result: 1001

我知道8年后我会写这篇文章,但现在不再建议使用moment.js库,因为它不再受支持,luxo.js是首选(就像moment.js的进化一样),你可以在这里找到更多:https://moment.github.io/luxon/api-docs/index.html