我有一份报告,其中所有日期都应显示在客户的时区中。该报告包括允许导出到 Excel 的功能。对于生成报告并将其导出到 Excel,我使用相同的过程。所有日期都以 UTC 格式存储在数据库中。我尝试在 SQL Server 中使用以下代码将 UTC 日期转换为客户端的本地时区:
DateUtc AT TIME ZONE 'UTC' AT TIME ZONE @TimeZoneName AS dateTimeCreated
@TimeZoneName 通过过程参数传递。我尝试通过以下代码在 JavaScript 中获取客户端时区名称。
const date = new Date();
const timeZoneString = new Intl.DateTimeFormat('en-US', {
timeZoneName: 'long'
}).format(date);
const timeZoneName = timeZoneString.split(',')[1].trim();
console.log(timeZoneName)
此代码不返回一致的值。例如,如果我位于 (UTC-12:00) 国际日期变更线西时区,JavaScript 会返回 GMT-12:00 值。但是,如果我使用尼泊尔时间,它会为每个时区返回一个随机值。如果我将 JavaScript 提供的确切值传递给该过程,该过程将引发异常,如下所示:
The time zone parameter 'Nepal Time' provided to AT TIME ZONE clause is invalid.
如何解决这个问题?有谁知道答案请帮帮我 我尝试使用 TimeZoneOffset 值,但它在夏令时期间会导致问题
如果您使用 JavaScript 传递时区名称,为什么不使用 JavaScript 来显示日期。您所要做的就是提供 ISO8601 格式的日期:
let date = new Date("2024-11-19T10:34:14.682Z");
console.log(date, date.toLocaleString());
为了确保与 SQL Server 的兼容性,您应该使用 IANA 时区 ID(例如“Asia/Kathmandu”),JavaScript 和 SQL Server 都可以识别该 ID。在 JavaScript 中,您可以像这样获取用户的时区:
const timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(timeZoneName); // Outputs something like "Asia/Kathmandu"
这为您提供了可靠且有效的时区 ID。
获得有效的时区 ID 后,将其传递给 SQL 过程来处理转换。查询应如下所示:
SELECT DateUtc AT TIME ZONE 'UTC' AT TIME ZONE @TimeZoneName AS dateTimeCreated
确保 @TimeZoneName 包含有效的时区 ID,例如 JavaScript 中的时区 ID。
如果您直接在浏览器中显示日期,则可以跳过服务器端转换并在 JavaScript 中全部处理。只需以 ISO 8601 格式发送 UTC 日期(例如“2024-11-19T10:34:14.682Z”)并让 JavaScript 处理转换:
const date = new Date("2024-11-19T10:34:14.682Z");
console.log(date.toLocaleString()); // Converts to the user's local timezone
如果您不需要担心不同用户之间的时区一致性,那么这种方法会更简单。
如果您需要进一步说明,请告诉我