在 JavaScript 中创建特定时区的日期对象并将其转换为 UTC

2023-12-03

我的应用程序当前以以下格式存储特定事件的日期和时间:

date: 2022-05-06
time: 00:00 // (12:00 AM)

每个事件的时间还包含与其关联的时区。如果组织活动的人来自新加坡,那么时区亚洲/新加坡.

当我向与会者发送此活动的日历邀请时,我想以 UTC 时间发送,以便在收件人一端,该邀请将位于他们的时区。 (注:我正在使用ics用于创建日历事件的包)。

所以,我想要的是创建一个日期对象time = 2022-05-06 00:00新加坡时区(根据上面的示例),然后将其转换为 UTC,这应该给出2022-05-05 16:00(因为亚洲/新加坡是 UTC+8)。我怎样才能实现这个目标?

提前致谢。


可能的方法必须建立在一些先决条件之上

  • 传递的日期时间字符串需要是一个可解析的字符串,表示目标时区的本地日期,因此它不包含可解析的时区偏移数据。
  • 时区提供为符合的名称 to IANA's 时区数据库.

那么实现如下

  • 创建一个Date来自可解析日期代表的实例(数字或字符串值)。

    • Note...此日期对象已经带有自己的时区偏移量,该偏移量由脚本运行所在的客户端/环境确定。
  • 为了生成稍后易于解析的符合 UTC 的自定义字符串格式,该方法利用format的方法Intl.DateTimeFormat of ECMAScript 的国际化 API.

    • Note...的配置options设置参数的唯一目标是返回自定义 UTC 日期时间字符串格式,其中可以轻松解析日期时区偏移量(不是提供的时区名称,而是形式中的数值)'+hh:mm' or '-hh:mm')
  • 时区偏移的小时和分钟通过正则表达式检索.../([+-]\d{2}):(\d{2})$/它与字符串末尾的模式匹配captures the offsetHours and offsetMinutes子串。

  • 两个字符串值都被解析为基于分钟的总数。

  • 现在,所提供的时区名称相对于日期对象的本地/客户端时间具有基于分钟的偏移量,需要通过以下方式进行补偿日期自己的时区偏移量

  • 最后一步是创建一个新日期,其中包含相对于所提供的时区名称与 UTC 的更正时区偏移量,这是通过日期的以毫秒为基础完成的getTime值和前一分钟的总计(以毫秒为单位)。

    • 现在可以选择将日期返回为toUTCString或再次作为自定义 UTC 符合字符串Intl.DateTimeFormat.format人们会选择的地方,例如'lt'(立陶宛语)作为locales字符串参数,因为立陶宛语支持日期格式'YYYY-MM-DD'(带有连接破折号)。

function createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  parsableDateWithoutTimeZoneOffset,
  ianaTimeZoneName,
) {
  const formatConfig = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour12: false,
    hour: '2-digit',
    minute: '2-digit',
    timeZone: 'UTC',
  };
  const date = new Date(parsableDateWithoutTimeZoneOffset);
  const format = new Intl.DateTimeFormat('en', {
    ...formatConfig,
    weekday: 'short',
    month: 'long',
    second: '2-digit',
    timeZone: ianaTimeZoneName,
    timeZoneName: 'longOffset',
  }).format(date);

  let [_, offsetHours = 0, offsetMinutes = 0] = format
    .match(/([+-]\d{2}):(\d{2})$/) ?? [];

  offsetMinutes = (parseInt(offsetHours, 10) * 60)
    + parseInt(offsetMinutes, 10)
    + date.getTimezoneOffset();

  // return new Date(
  //   date.getTime() - (offsetMinutes * 60000)
  // )
  // .toUTCString();

  return new Intl.DateTimeFormat('lt', formatConfig)
    .format(date.getTime() - (offsetMinutes * 60000));
}

console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Singapore'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Singapore'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Kabul'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Kabul'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Istanbul'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Asia/Istanbul'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Europe/Amsterdam'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Europe/Amsterdam'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'UTC'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'UTC'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'America/Jamaica'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'America/Jamaica'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'America/Anchorage'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'America/Anchorage'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Marquesas'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Marquesas'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Honolulu'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Honolulu'
));
console.log(`createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Chatham'
) ...`, createCustomUTCDateStringFromLocalDateAndTimeZoneName(
  '2022-05-06T00:00', 'Pacific/Chatham'
));
.as-console-wrapper { min-height: 100%!important; top: 0; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中创建特定时区的日期对象并将其转换为 UTC 的相关文章

随机推荐

  • Hadoop 类型与映射预期值中的键不匹配文本收到的值 LongWritable

    有人知道为什么我会收到此错误吗 我看过很多其他类似的帖子 但其中大多数不适用于我 我也尝试了发布的一些确实适用于我的解决方案 但它们不起作用 我确信我只是错过了一些愚蠢的东西 谢谢您的帮助 chris chrisUHadoop usr lo
  • 将按类别分类的行添加到我的数据框中

    我使用 groupby 创建了一个新的聚合数据框 但在每个类别下添加小计行时遇到问题 我尝试过使用 pd groupby 和数据透视表并更改索引 但我无法按照我想要的方式表示数据 为每个 客户 创建 USD Balance 小计 但将其添加
  • 如何使可调用的谷歌云函数幂等

    我有一个谷歌云功能 可以向 firebase 主题发送通知 该功能一直工作正常 直到突然 它开始同时发送多个通知 2 或 3 联系 Firebase 支持团队后 他们告诉我我应该使函数幂等 但我不知道如何 因为它是一个可调用函数 更多细节
  • 将新的 APNS 证书上传到 GCM

    我们有一个使用 GCM 的 iOS 和 Android 应用程序 我正在尝试将新的生产 APNS 证书上传到 GCM 但无法上传 因为 Google 正在将 GCM 迁移到 Firebase 我怎么做 这是 Google 开发者产品的屏幕截
  • 自动标记 C 中未使用的结构成员

    我需要一个工具来自动标记未使用的结构成员在 C 代码库中 我对 未使用 的定义很简单 如果从代码中删除结构成员定义 并且代码编译成功 则该结构成员被声明为未使用 问题是 如何以自动化方式完成此操作 由于代码库很小 速度并不是太重要 关于该主
  • Marionette.js appRouter 在应用程序启动时未触发

    我目前正在将 Marionette 集成到现有的 Backbone 应用程序中 我已经有一个现有的 Backbone 路由器 但我正在尝试实现 Marionette AppRouter 来取代它 问题是 在新 Marionette 路由器应
  • 调试 Qt 源代码

    是否可以进入 Qt 源 例如qmainwindow cpp 在 Qt Creator 中 目前我正在看到反汇编 但如果能看到源代码就好了 当然 但你可能必须首先 转到 QT HOME qt 使用 debug 或 debug and rele
  • 将 uiimage 设置为 nil 不会使用 ARC 释放内存

    我有一个滚动视图 它在页面滚动时显示不同的图像 例如 PhotoScroller 我正在使用ARC 当有人滚动到另一个页面时 我将当前未显示的 UIImageView 的图像属性设置为 nil 作为 尝试 避免内存崩溃 这种情况仍在发生 然
  • Now.js 中的会话支持

    Now js 引用 只需在 nowjs initialize 中传递一个连接或快速 http 服务器 this user session 就应该可用 So express require express app module exports
  • 如果任何线程发生异常,则中断所有线程

    我有一个方法名称someTask我必须调用 100 次 并且我正在使用异步编码 如下所示 for int i 0 i lt 100 i futures add CompletableFuture supplyAsync gt someTas
  • Postgres 中的递归 CTE

    我有一个结构如下的表 Employee ID Employee Name Manager ID 而且 对于每个员工 我都需要出示最高管理者的 ID 我的意思是 例如 如果我有 EmployeeID 2 其经理为 3 因此 数字 3 的经理为
  • 如何允许某些特定IP地址访问我的WCF服务

    我有一个 WCF 服务返回 xml 我只想要一个 IP 地址来访问它 例如 10 0 0 5 有人可以告诉我我该怎么做吗 请告诉我除防火墙和 IIS 之外的其他内容 您需要添加 ip 过滤 如下所示 https stackoverflow
  • 将文本值输入到 div 中?

    假设我有这个文本框
  • IPv6 的示例数据?

    是否存在 IPv6 流量的示例数据集 例如Apache 日志还是流量分析日志 或者 是否有人有任何想法如何生成一个或 乐观地 现有工具来生成数据 理想情况下 我希望实际部署的示例地址与该范围内的地址数量和 或来自这些范围的预期流量成比例 即
  • 访问资源目录路径

    看起来 NSBundle mainBundle pathForResource name ofType png 对于 Images xcassets 资产目录内的资产 不返回任何内容 我也尝试过 NSBundle mainBundle pa
  • 雅虎 YQL RSS - 错误请求

    为了使用 jQuery 发出跨域 AJAX 请求 我尝试使用 YQL RSS select from rss where url https www top1000funds com feed most popular posts My c
  • C++中如何将字符串转换为char *?

    我怎样才能转换string in to char 我使用了以下方法 但它不起作用 在运行时它给我以下错误 运行时检查失败 3 变量 url 正在被使用而没有 正在初始化 尽管我已经将其初始化 如下面的代码所示 你能给我举个例子吗 char
  • 具有动态键的对象的 Apollo/GraphQL 字段类型

    假设我的 graphql 服务器想要以 JSON 形式获取以下数据 其中person3 and person5是一些 id persons person3 id person3 name Mike person5 id person5 na
  • JTable 基于隐藏列的排序

    我想排序JTable基于一个隐藏列的行 假设我有一个像这样的 JTable column1 column2 val1 val2 现在我又多了一个被隐藏的column3 我不想显示 当用户单击 Column2 时 它应该根据 Column3
  • 在 JavaScript 中创建特定时区的日期对象并将其转换为 UTC

    我的应用程序当前以以下格式存储特定事件的日期和时间 date 2022 05 06 time 00 00 12 00 AM 每个事件的时间还包含与其关联的时区 如果组织活动的人来自新加坡 那么时区将亚洲 新加坡 当我向与会者发送此活动的日历