【问题标题】:Parse time string and convert it into a date object in Javascript解析时间字符串并将其转换为 Javascript 中的日期对象
【发布时间】:2018-09-06 07:23:46
【问题描述】:

我想通过这个字符串在 TypeScript (AngularJS) 中创建一个 Date 对象:08:00:00.000+01:00,以便最后使用过滤器仅显示小时和分钟:

.filter('toDate', () => {
    return input => {
        let date = Date.parse(input);
        return date;
    }
})

在 HTML 中:

{{ object.unformatedTimeString | toDate | date: 'H:m' }}

有没有人知道如何解析这样一个时间字符串的好方法?

【问题讨论】:

  • 为什么不直接从字符串中提取小时和分钟呢? let [hr, min] = str.split(':');。为什么要转换?
  • 因为时间字符串中也有时区信息。最好正确转换。
  • 你考虑过使用moment.js吗?它比 javascripts 日期对象更通用。
  • @Igor 它也是庞大而复杂的。如果您有很多日期操作,那么值得一试,但不一定适用于小东西。
  • moment.js 如果能很好地集成到 AngularJS (1.6.x) 中,将是一个选择。

标签: javascript angularjs date filter


【解决方案1】:
Let [ts, tz] = str.split(/[\+\-]/);
let [hr, min] = ts.split(':').map(Number);
let offsetSign = str.includes('+') ? 1 : -1;
let [offsetHr, offsetMin] = tz.split(':');
let offset = offsetSign * ((offsetHr * 1000 * 60 * 60) + (offsetMin * 1000 * 60));

let date = new Date();
date.setHour(hr);
date.setMinute(min);
let result = new Date(date.getTime() + offset);

乏味,但并不复杂或困难。

【讨论】:

  • 无需将[hr, min] 转换为数字,因为乘法会根据需要进行转换,您应该使用date.setHour(hr, min, 0, 0) 一次性设置时间。这可能会返回当前日期之前的日期,OP 应该彻底测试以确保逻辑正确,它可能需要设置 UTC 小时和分钟。 ;-)
【解决方案2】:

一种解决方案是调整时区的时间,使其成为 UTC 时间,然后将其应用于当前的 UTC 日期,例如

function parseToUTCTime(s) {
  var now = new Date();
  var b = s.match(/\d+|\D/g);
  var sign = b[7]=='+'? 1 : -1;
  now.setUTCHours(+b[0] + sign*b[8], +b[2] + sign*b[10], 0, 0);
  return now;
}

// Tests
['08:00:00.000+01:00',
 '06:30:00.000-08:00',
 '04:15:00.000+05:30'].forEach(ts =>
   console.log(ts + ' -> ' + parseToUTCTime(ts).toISOString())
 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2011-03-07
    • 2012-10-18
    相关资源
    最近更新 更多