【问题标题】:Keep local date in UTC [closed]保持UTC的本地日期[关闭]
【发布时间】:2021-10-29 08:55:07
【问题描述】:

所以我有一个使用 React 构建的前端应用程序,以及一个使用 .Net (C#) 构建的后端。 我有这个时间转换落后 1 天的问题。

所以在我的前端,日期是正确的,采用本地时间格式,当 API(backend, C#) 接收到数据时,它将日期转换为 UTC,使其落后 1 天。

当我尝试获取 localdate 与 UTC 日期的差异时,使用 moment 会导致结果为 0。我想保留日期,即使它是 UTC。

【问题讨论】:

  • 能分享一下后端端点的代码吗?
  • 它们是同一时刻,因此差异为0,也许您的意思是您正在寻找时区偏移量?
  • @pilchard 如何获得偏移量?
  • 您当地的时区是什么时区?你能给出一个输入和输出日期的具体例子,预期的和实际看到的吗?后端使用的是DateTime还是DateTimeOffset

标签: javascript c# .net momentjs


【解决方案1】:

我建议使用 UTC 时间将日期从前端传递到后端。它们是明确的,不会依赖于用户所在的时区。

您可以使用Unix time,即自 1970 年 1 月 1 日 00:00 UTC 以来的秒数/毫秒数,例如1635494392 ISO 8601,日期和时间的明确字符串编码,例如2021-10-29T08:27:22Z.

我建议使用 ISO 8601 日期,因为它们比 unix 日期更容易观察。原生 JS 日期对象和所有时间/日期库也支持它们。

如果您将2021-10-29T08:27:22Z 之类的日期发送到后端,则无需将其转换为UTC,并且不存在歧义。

同样,当前端从后端接收到日期时,使用 ISO UTC 日期将意味着该日期将被明确地解析和理解。

转换为当地时间也很容易,例如使用Date.toLocaleString()。这将默认显示在用户的本地时区,但您可以使用参数 { timeZone: 'xxx' } 在任何时区显示。

例如:

const timestampFromBackend = '2021-10-29T08:27:22Z';
const dateFromBackend = new Date(timestampFromBackend);

console.log('Date from backend (UTC):', dateFromBackend.toLocaleString([], { timeZone: 'UTC'}));
console.log('Date from backend (local):', dateFromBackend.toLocaleString());

// We can display in any timezone if we wish
console.log('Date from backend (Pacific Time):', dateFromBackend.toLocaleString([], { timeZone: 'America/Los_Angeles'}));
.as-console-wrapper { max-height: 100% !important; top: 0; }

同样,我们始终可以使用 Date.toISOString() 将前端日期转换为 ISO UTC 日期:

const frontEndDate = new Date();
const dateToBackend = frontEndDate.toISOString();

console.log('frontEndDate:', frontEndDate.toString() );
console.log('ISO string to send to backend:',dateToBackend);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    一个非常简单的解决方案是在发送请求之前在前端创建一个日期对象,例如:

    var dt = new Date();
    

    并将其发送到服务器。在服务器上,您也可以测量 UTC 日期,计算两者的差异,将其四舍五入到最接近的可能有效时区值(请注意,某些时区,如阿富汗,如果我没记错的话,偏移量不是整小时,我相信距离 UTC 大约 3 小时 30 分钟)并将该偏移量添加到发送的任何日期中。

    所以,除了你的前端发送到服务器的实际时间之外,测量实际时间并发送它,然后在服务器上查看它与 UTC 的距离。

    这仍然不是 100% 准确,因为如果某些日期与发送请求的时间相距很远,并且还涉及 DS(夏令时)偏移量,那么在某些情况下您可能会离开一个小时。

    如果这种不准确性令人担忧,那么我们需要为解决方案添加一些复杂性,即在这种情况下,您可能需要在前端获取用户的位置。请注意,他们不必必须允许这样做,因此可能无法访问。但是,如果您知道他们的位置,那么您也知道他们的时区。并且使用他们的时区,您可以准确地convert any date from that timezone to UTC

    【讨论】:

      猜你喜欢
      • 2015-06-03
      • 2023-03-10
      • 2012-10-29
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多