保留 UTC 格式的本地日期

rod*_*abs 0 .net javascript c# momentjs

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

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

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

Ter*_*nox 6

我建议使用 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'}));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

同样,我们始终可以使用 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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)