将 Windows 时区转换为 moment.js 时区?

2023-11-27

我们在 ASP.NET 中有一个应用程序,它以 Windows 格式存储所有用户时区数据(通过 TimeZoneInfo.Id)。

我们还使用 moment.js 和 moment.js TimeZone 库将 UTC 数据转换为客户端的用户数据。这是一个复杂的 AngularJs 应用程序,需要在客户端进行时区转换。

到目前为止,我们使用 NodaTime .NET 库将 Windows 时区 ID 转换为 Moment.js 时区 ID。它适用于大多数常见时区。 但我们需要让这个转换100%兼容。

目前看来,没有可靠的方法将 Windows 时区 ID 映射到 IANA 时区数据。有很多差异。

我相信现代 JS 应用程序经常处理时区。有时需要在服务器端(C#)和客户端(JS)精确转换 TZ。

有没有办法严格映射/转换.NETTimeZoneInfo进入 Moment.js 时区对象?


TL;DR:

  • 服务器端继续使用Noda Time
  • 选择是使用BCL数据还是IANA数据;我个人会推荐 IANA,但这由您决定。 (除此之外,IANA 数据的版本更加清晰。)
  • 使用 Noda Time 生成 moment.js 数据,以便您了解exactly客户端将使用什么,并且它将与您在服务器上所做的保持一致
  • 针对数据变化时发生的情况制定策略

Details:

有时需要在服务器端(C#)和客户端(JS)精确转换 TZ。

你需要得到exactly双方时区数据相同and双方的等效实现。这有问题,因为:

  • IANA 时区数据会定期更新(因此您需要能够说“使用数据 2015a”)
  • Windows时区数据定期更新
  • 我不敢打赌 IANA 规则的每次实施都完全相同,尽管它们应该是相同的
  • I knowTimeZoneInfo随着时间的推移,实施方式发生了变化,部分是为了删除一些odd bugs并部分地包含更多数据。 (.NET 4.6 理解时区改变其历史标准偏移量的概念;早期版本不理解)

使用 Noda Time,您可以非常轻松地将 BCL 或 IANA 时区数据转换为 moment.js 格式 - 并且比 Evgenyt 的代码更可靠,因为TimeZoneInfo不允许您请求转换。 (由于错误TimeZoneInfo本身,有一些小口袋,偏移量可以在几个小时内改变 - 它们不应该改变,但如果你想匹配TimeZoneInfo行为准确,你需要能够找到所有这些 - Evgenyt 的代码并不总是能发现这些。)即使 Noda Time 不镜像TimeZoneInfo准确地说,它应该符合itself.

moment.js 格式看起来非常简单,因此只要您不介意将数据传送到客户端,这绝对是一个选择。不过,您需要考虑当数据发生变化时该怎么办:

  • 如何在服务器上获取它?
  • 您如何应对客户端暂时使用旧数据的情况?

如果精确的一致性对您来说确实很重要,您可能希望将时区数据与时区数据版本一起发送到客户端......然后客户端可以在发布数据时将其返回给服务器。 (当然,我假设它正在这样做。)然后服务器可以使用该版本,或者拒绝客户端的请求并说有更新的数据。

下面是一些将 Noda 时区数据转换为 moment.js 的示例代码 - 对我来说看起来不错,但我还没有用它做太多事情。它与 momentjs.com 中的文档匹配...请注意,必须反转偏移量,因为 moment.js 决定使用positive时区的偏移量是behindUTC,出于某种原因。

using System;
using System.Linq;

using NodaTime;
using Newtonsoft.Json;

class Test
{
    static void Main(string[] args)
    {
        Console.WriteLine(GenerateMomentJsZoneData("Europe/London", 2010, 2020));
    }

    static string GenerateMomentJsZoneData(string tzdbId, int fromYear, int toYear)
    {
        var intervals = DateTimeZoneProviders
            .Tzdb[tzdbId]
            .GetZoneIntervals(Instant.FromUtc(fromYear, 1, 1, 0, 0),
                              Instant.FromUtc(toYear + 1, 1, 1, 0, 0))
            .ToList();

        var abbrs = intervals.Select(interval => interval.Name);
        var untils = intervals.Select(interval => interval.End.Ticks / NodaConstants.TicksPerMillisecond);
        var offsets = intervals.Select(interval => -interval.WallOffset.Ticks / NodaConstants.TicksPerMinute);
        var result = new { name = tzdbId, abbrs, untils, offsets };
        return JsonConvert.SerializeObject(result);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Windows 时区转换为 moment.js 时区? 的相关文章

随机推荐

  • 离子/角度传单指令 - 放大/缩小按钮不起作用

    我对传单地图上的默认放大 缩小按钮有一些问题 当我直接加载页面时 一切正常 但是当我将一种状态更改为声明传单指令所在位置时 按钮就不起作用 给你例子 http codepen io anon pen JkyEg editors 101 代码
  • 从指定列中减去 pandas 列

    如何从指定列中动态减去多个 pandas 数据帧列中的值 在这种情况下 如何从存款中减去 A B C 列 并将该值放入相应的 A B C 列中 date deposit A B C 0 2017 01 15 12 5 10 12 1 201
  • PHP 将每个项目的 foreach 输出显示到屏幕上

    我在 php 中注意到的一件事是 在脚本停止工作之前 屏幕上不会输出任何内容 对于我正在从事的项目 我输入了超过 100 个项目的列表 它对每个项目执行 HTTP 请求 完成后 显示一个页面 其中包含每个项目的状态 成功 失败等 我想知道是
  • lastModified() 函数返回当前日期和时间

    我的问题是 为什么当我在网页上使用 document lastModified 时 它会返回当前日期和时间 而不是该页面上次修改的时间 有任何想法吗 提前致谢 实际代码是 因为你现在正在修改它 检查一下这个example 为了根据您的要求进
  • 如何在云端成功托管用 Python 编写的 Telegram 机器人(免费)?

    我跟着本教程使用 Python 创建 Telegram 机器人 最后 我在我的机器上本地运行它ngrok 为了测试这个机器人 我在 Telegram 中向它发送了消息 有效 所以这是一个很好的教程 但是 现在我想在云端托管机器人 因为我当然
  • Rails/Javascript:如何将 Rails 变量注入(非常)简单的 javascript

    我想在rails中编写一个非常简单的javascript计算器 它将输入字段的数量乘以rails变量中存储的数字 item base price 所以 在 javascript coffeescript 方面 粗略地说是这样的 app as
  • 如何从 C 程序中获得 100% CPU 使用率

    这是一个非常有趣的问题 所以让我来介绍一下场景 我在国家计算博物馆工作 我们刚刚设法让一台 1992 年的 Cray Y MP EL 超级计算机运行起来 我们真的很想看看它能跑多快 我们认为最好的方法是编写一个简单的 C 程序来计算素数并显
  • 在 python 包中添加和读取 config.ini 文件

    我正在编写我的第一个 python 包 我想将其上传到 PyPI 上 我基于此构建了我的代码博客文章 我想将用户设置存储在 config ini 文件中 在同一包中的单独 python 模块中读取一次 每次运行包时 并将用户设置保存在该模块
  • 测试使用会话的 Sinatra 应用程序

    如何测试使用会话的 Sinatra 应用程序 get rack session gt foo gt blah 这段代码对我不起作用 我在我的应用程序中有 启用 会话 看起来问题实际上是有enable sessions活性 您必须停用此设置才
  • 如何在 .Net 中操纵令牌权限?

    我想使用 C 来确定分配给我的进程 线程令牌的权限 并根据需要进行调整 例如 为了让我的程序重新启动计算机 它必须首先启用SeShutdownPrivilege特权 如何通过托管代码安全地完成此操作 事实证明这并不简单 因为没有内置的机制
  • 我使用 AFNetWorking 时出现错误代码 -1011

    我在我们的客户公司做服务 我尝试通过 AFNetWorking 从他们的服务器获取一些信息 我们的客户鼓励使用 AFNetWorking 我使用 AFNetWorking 做了一些示例 并且成功了 但是当我使用我们的客户 URL 之一来获取
  • 如何调用Blazor服务器端CircuitHandler中的方法?

    我正在通过 Blazor 服务器端制作一个聊天室应用程序 我想显示每个用户的在线状态 我问了一个关于如何在关闭页面时获取事件的问题如何在 blazor 服务器端关闭页面时获取事件 现在看来CircuitHandler是最好的选择 当用户关闭
  • Python 快速排序 - 列表理解与递归(分区例程)

    我看了演讲 三个美丽的快速排序 并开始尝试快速排序 我在 python 中的实现与 c 非常相似 选择枢轴 围绕它进行分区并在较小和较大的分区上递归 我以为不是pythonic 这就是在 python 中使用列表理解的实现 def qsor
  • 如何在 Nginx 上使用 FastCGI 防止网关超时

    我正在运行 Django FastCGI 和 Nginx 我正在创建一个 api 人们可以通过 XML 发送一些数据 我将处理这些数据 然后为发送过来的每个节点返回一些状态代码 问题是 如果我处理 XML 的时间太长 我认为超过 60 秒
  • 当我尝试使用 UI Automation for PowerPoint 2013 时,我只能在使用 RangeFromPoint 时获取第一个字符/单词

    该代码适用于 Word 和 Outlook 但不适用于 PowerPoint 因为仅选择文本框的第一个字符或第一个单词 这是一个错误吗 有什么解决方法吗 在 PowerPoint 2013 中的简单 PowerPoint 幻灯片上尝试此操作
  • IOMobileFramebufferGetLayerDefaultSurface 在 iOS 9 上不起作用

    我的主要问题是 如何对已经存在但在新版本的 iOS 中进行了修改的私有 API 函数进行逆向工程 我创建了一个 iOS 应用程序来使用 IOSurface 和 IOMobileFramebuffer 记录屏幕内容 帧缓冲区用于打开它的主要函
  • 如何从单个 Jenkins Pipeline 并行块获取 stdout 和 stderr?

    我正在使用一个parallel阻止到我的 Jenkinsfile 中同时执行一些测试 但所有输出都变得混乱 这是我的 Jenkinsfile 的摘录 例如 do some IT against different databases sta
  • 使用 ramda group by 属性并对指定属性求和结果

    我需要帮助使用 ramda 转换对象数组 我想 按指定属性分组 对另一个属性求和 结果集 给定一个像这样的数组 var arr title scotty age 22 score 54 hobby debugging title scott
  • 如何访问 GridSearchCV 中的 ColumnTransformer 元素

    当引用 grid search 的 param grid 中的 ColumnTransformer 它是管道的一部分 中包含的单个预处理器时 我想找出正确的命名约定 环境和样本数据 import seaborn as sns from sk
  • 将 Windows 时区转换为 moment.js 时区?

    我们在 ASP NET 中有一个应用程序 它以 Windows 格式存储所有用户时区数据 通过 TimeZoneInfo Id 我们还使用 moment js 和 moment js TimeZone 库将 UTC 数据转换为客户端的用户数