首页 > 解决方案 > 如何在特定时区转换日期并发送到服务器

问题描述

我的场景是使用浏览器时区(仅使用new Date())创建的 Date 对象并发送到服务器,但我想用另一个特定的时区发送这个日期,假设它是欧洲/雅典。

实际日期字符串的最佳表示是什么,以便我可以在实际欧洲/雅典日期的后端将其转换回 Date 对象?

我有时区信息,但不确定如何获取Fri Feb 05 2021 05:30:00 GMT-0500 (Eastern Standard Time)并将其转换为欧洲/雅典日期。

我曾尝试使用 date-fns 但没有走远。

标签: javascriptdatetimezone

解决方案


你有几个不同的问题和误解,所以我将尝试解决每个问题,从标题中的问题开始:

如何在特定时区转换日期并发送到服务器

  • 如果您的意思是日期2021-01-18则不能在特定时区。根据定义,它只是一个日期。想想你可能挂在墙上的印刷日历,每个日期都有一个正方形。没有与此类日历关联的时区。可以问“现在在特定时区是什么日期”,但答案本身没有时区。

  • 相反,如果您指的是 JavaScriptDate对象,那么答案又是“您不能”。该Date对象实际上不是日期,也没有时区,而是时间戳。在内部,一个Date对象只保存一个值——自 1970-01-01 00:00:00.000 UTC 以来经过的毫秒数(不考虑闰秒)。它没有时区。相反,某些功能,例如在运行时.toString()应用系统本地时区。该时区来自操作系统(在大多数情况下)。它不存储在Date对象本身内部。

我的场景是使用浏览器时区创建的 Date 对象(仅使用new Date())...

这将使用浏览器运行的系统时钟,但时区不相关。该Date对象将从代表“现在”的 Unix 时间戳构造。这样的时间戳本质上是基于 UTC 的。浏览器直接从操作系统获取 UTC 时间,不考虑时区。

...并发送到服务器

如果不经过一侧的反序列化和另一侧的序列化,就无法将对象发送到服务器。

...但我想用另一个特定的时区发送这个日期,假设它是欧洲/雅典。

实际日期字符串的最佳表示是什么,以便我可以在实际欧洲/雅典日期的后端将其转换回 Date 对象?

由于该对象仅代表“现在”,因此您无需以特定于时区的格式发送它。只需发送UTC时间。理想的格式是 ISO 8601,可以直接使用对象中的.toISOString()函数获得Date

根据您的用例,您还可以考虑是否可以改为从服务器获取 UTC 时间。至少你可以控制时钟。

在服务器端,如果您需要特定时区的时间,则在服务器上从 UTC 转换为该时区,而不是在客户端上。

另外,来自评论:

我相信即使是 EPOCH 在时区之间也是不同的。我可以得到 EPOCh,然后尝试转换到特定的时区。

这在几个层面上是不正确的。首先,要理解epoch只是一个英文单词,本质上是“一个起点的表示”。它不是格式,也不是首字母缩写词。在 JavaScript 中,Date对象使用 Unix 时间戳,它使用1970-01-01T00:00:00.000Z. 换句话说,UTC 时间 1970 年 1 月 1 日午夜是0时间戳。有时,此类时间戳被称为“纪元时间”。在我看来,这是用词不当,但即便如此 - 它们始终基于 UTC。没有时区,因此它们对于整个世界都是一样的。


推荐阅读