【问题标题】:How to ONLY replace the next two characters如何只替换接下来的两个字符
【发布时间】:2021-12-21 16:14:00
【问题描述】:

我正在尝试将 ISO 时间重置为本地时间,但在转换时遇到了一些问题。

目前,我:

// incoming ISO date
let date = new Date('2021-11-08T20:31:23.746Z');

// 1. get timezone offset in hours
const offset = date.getTimezoneOffset() / 60;

// 2. calculate local hour
let localHour = date.toISOString().split('T')[1].substring(0, 2) - offset;

// 3. calculate local time
let localTime = date.toISOString().replace(/[T-:]/, localHour);

console.log(localTime);

// ISO Date
// 2021-11-08T20:31:23.746Z (original)
// 2021-11-08T13:23.746Z (local timezone)

在第 3 步中,我尝试仅替换“T”之后的前两个字符,但是,这不是正则表达式的正确解决方案。

【问题讨论】:

  • 正则表达式应为 T.. 以匹配 T 和以下 2 个字符。
  • 如果时差改变日期,这将不起作用。

标签: javascript string time timezone date-conversion


【解决方案1】:

停在那里,不要这样做。日期管理很难。你要朝自己的脚开枪。使用库,例如​​ dayjs

dayjs(date).local().toDate()

【讨论】:

    【解决方案2】:

    Date 构造函数在解析后自动将日期转换为您的语言环境。

    // incoming ISO date
    let date = new Date('2021-11-08T20:31:23.746Z');
    
    const res = date.toLocaleString().replaceAll('/', '-').split(', ').join('T')
    console.log(res)
    
    // ISO Date
    // 2021-11-08T20:31:23.746Z (original)
    // 2021-11-08T13:23.746Z (local timezone)

    【讨论】:

    • 当我运行它时,它给了我“2021 年 11 月 8 日星期一 13:31:23 GMT-0700(山地标准时间)”。如何将其转换回 ISO,但使用当地时间?
    • @TylerMorales 我已经更新了我的答案。它现在应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多