如何使用“浪漫标准时间”设置时区?

问题描述 投票:0回答:2

我有 UTC 日期字符串

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

到目前为止我找到的时区库使用 IANA 时区,例如

"Europe/Copenhagen"
,因此可以将
"Romance Standard Time"
转换为
"Europe/Paris"
之类的库也可以回答我的问题。这种转换是在 .NET 而不是 JavaScript 中完成的,这是可以接受的。

javascript c# .net browser timezone
2个回答
3
投票

关键是要了解

"Romance Standard Time"
Windows 时区 ID。其他人都使用 IANA 时区 ID。它们具有地区/城市格式,例如
"Europe/Copenhagen"

在 .NET 6 中可以在格式之间进行转换。以下是来自.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,所以这可能也是一种可能性。 将 Windows 时区转换为 moment.js 时区?


1
投票

JavaScript

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

moment.js 推荐的库列表

无论如何,如果您希望使用时刻并转换为时区,您可以使用Moment-Timezone轻松实现。 所有支持的时区

例如:

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。

我发现了一个不错的图书馆在这里

这是一个如何先转换时区然后使用 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

在这里您可以找到所有支持的 timezoneId 的列表

© www.soinside.com 2019 - 2024. All rights reserved.