【问题标题】:How can use "Romance Standard Time" to set the time zone?如何使用“浪漫标准时间”设置时区?
【发布时间】:2022-01-06 13:43:27
【问题描述】:

我有 UTC 日期字符串 "2022-01-06T13:35:00Z" 和时区字符串 "Romance Standard Time"。如何在 JavaScript 中(在浏览器中)使用该时区字符串,以便将时间更正为 14:35?

到目前为止,我发现的时区库使用 IANA 时区,例如"Europe/Copenhagen",因此可以将"Romance Standard Time" 转换为"Europe/Paris" 之类的库也可以回答我的问题。这种转换是在 .NET 而不是 JavaScript 中完成的,这是可以接受的。

【问题讨论】:

  • 你想要它同时用于 .NET 和 JS 吗?
  • .NET 或 JS 都可以接受。我最终回答了我自己的问题,因为我发现您可以在 .NET 6 中转换为 IANA 时区。(实际上我很惊讶我没有偶然发现可以进行转换的 JavaScript 库。)跨度>
  • 你可以看看我的回答,你可以将 moment.js 用作 javascript 库
  • Moment.js 没有解决这个问题,@MrJami,因为它使用 IANA 时区,而我拥有的是 Windows 时区。 (这也是我没有接受你的回答的原因。)
  • 哦 - 我没注意到。 github.com/rubenillodo/windows-iana 非常整洁。感谢您链接到它。

标签: javascript c# .net browser timezone


【解决方案1】:

关键是要了解"Romance Standard Time" 是一个Windows 时区ID。其他所有人都使用 IANA 时区 ID。它们具有区域/城市格式,例如"Europe/Copenhagen".

在 .NET 6 中,可以在格式之间进行转换。这是来自Date, Time, and Time Zone Enhancements in .NET 6 的代码示例。

// Conversion from Windows to IANA when a region is unknown.
string windowsTimeZoneId = "Eastern Standard Time";
if (!TimeZoneInfo.TryConvertWindowsIdToIanaId(
    windowsTimeZoneId, out string ianaTimeZoneId))
{
    throw new TimeZoneNotFoundException(
        $"No IANA time zone found for "{windowsTimeZoneId}".");
}
Console.WriteLine($"{windowsTimeZoneId} => {ianaTimeZoneId}");
// "Eastern Standard Time => America/New_York"
// Conversion from Windows to IANA when a region is known.
string windowsTimeZoneId = "Eastern Standard Time";
string region = "CA"; // Canada
if (!TimeZoneInfo.TryConvertWindowsIdToIanaId(
    windowsTimeZoneId, region, out string ianaTimeZoneId))
{
    throw new TimeZoneNotFoundException(
       $"No IANA time zone found for "{windowsTimeZoneId}" in "{region}".");
}
Console.WriteLine($"{windowsTimeZoneId} + {region} => {ianaTimeZoneId}");
// "Eastern Standard Time + CA => America/Toronto"

如果您使用的是早期版本的 .NET,则可以使用 TimeZoneConverter。如果您需要构建自己的转换器,以下是时区的完整列表:windowsZones.json。

这个问题的答案建议使用 NodaTime,所以这可能也是一种可能性:Convert Windows timezone to moment.js timezone?

【讨论】:

    【解决方案2】:

    JavaScript

    如果你想用 Javascript 来做,有多个库。我最熟悉moment.js,但它们已被弃用,这意味着如果您正在处理一个新项目,您可能需要使用另一个库。

    List of suggested libraries by moment.js.

    无论如何,如果您希望使用时刻并转换为时区,您可以使用Moment-Timezone 轻松做到这一点。 All supported timezones.

    例如:

    const moment = require('moment-timezone');
    const timeZone = "Europe/Paris";
    
    const ISOString = "2022-01-06T13:35:00Z"; //2022-01-06T13:35:00Z
    const momentDefault = moment(ISOString).format(); //2022-01-06T14:35:00+01:00
    const momentTz = moment.utc(ISOString).tz(timeZone).format(); //2022-01-06T14:35:00+01:00
    

    如您所见,moment 默认获取时区并将 ISOString 作为 UTC 值处理,因此它会自动将该值转换为客户端用户的时区。

    您仍然可以明确告诉 moment 将 ISOString 作为 UTC ISOString 处理,然后将其转换为您定义的特定时区。这样,客户端的时区将被忽略。

    编辑: 现在我意识到提问者希望将时区从 Windows 转换为 Iana,然后再用 Javascript 进行转换,因为包括 Moment.js 在内的大多数库都不支持 Windows 时区 ID。

    我找到了一个不错的库here。

    这里是一个如何先转换时区然后使用moment.js的例子。

    import { findIana } from 'windows-iana';
    const moment = require('moment-timezone');
    
    const result = findIana('Romance Standard Time');
    console.log(result); // ['Europe/Paris', 'Europe/Brussels', 'Europe/Copenhagen', 'Europe/Madrid', 'Africa/Ceuta']
    const timeZone = result[0]; //doesn't really matter which one to take, if you are just converting the times.
    
    const ISOString = "2022-01-06T13:35:00Z"; //2022-01-06T13:35:00Z
    const momentDefault = moment(ISOString).format(); //2022-01-06T14:35:00+01:00
    const momentTz = moment.utc(ISOString).tz(timeZone).format(); //2022-01-06T14:35:00+01:00
    

    .NET C#

    要在 C# 中将时间转换为特定时区,您不需要任何额外的包,您可以简单地执行以下操作:

    var isoString = "2022-01-06T13:35:00Z";
    var utcDate= DateTime.Parse(isoString);
    var timeZone = "Romance Standard Time";
    var date = TimeZoneInfo.ConvertTime(utcDate, TimeZoneInfo.FindSystemTimeZoneById(timeZone)); //01/06/2022 14:35:00
    

    在这里你可以找到all supported timezoneIds的列表

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 2012-04-06
      • 1970-01-01
      • 2018-03-15
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多