javascript - 如何在特定时区转换日期并发送到服务器
问题描述
我的场景是使用浏览器时区(仅使用new Date()
)创建的 Date 对象并发送到服务器,但我想用另一个特定的时区发送这个日期,假设它是欧洲/雅典。
实际日期字符串的最佳表示是什么,以便我可以在实际欧洲/雅典日期的后端将其转换回 Date 对象?
我有时区信息,但不确定如何获取Fri Feb 05 2021 05:30:00 GMT-0500 (Eastern Standard Time)
并将其转换为欧洲/雅典日期。
我曾尝试使用 date-fns 但没有走远。
解决方案
你有几个不同的问题和误解,所以我将尝试解决每个问题,从标题中的问题开始:
如何在特定时区转换日期并发送到服务器
如果您的意思是日期,
2021-01-18
则不能在特定时区。根据定义,它只是一个日期。想想你可能挂在墙上的印刷日历,每个日期都有一个正方形。没有与此类日历关联的时区。可以问“现在在特定时区是什么日期”,但答案本身没有时区。相反,如果您指的是 JavaScript
Date
对象,那么答案又是“您不能”。该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。没有时区,因此它们对于整个世界都是一样的。
推荐阅读
- wso2 - WSO2 AM 默认服务器 IP 地址
- python - 为子分组和回归 lmplot 获取正确的 Date 属性
- .net - 正则表达式积极前瞻不会阻止匹配
- linux - Android 模拟器在 Linux 操作系统上没有互联网连接
- arrays - 如何对数组内的数字字符串进行操作(在 powershell 中)?
- github - 将特定文件从 Azure DevOps 管道发送到 Github
- ms-access - 从表中选择随机记录,但不超过 2 条同名记录
- c# - Razor 页面中具有多个搜索字段的分页列表
- c# - Xamarin Picker 在 UI 上显示不需要的元素
- swift - Swift:在滚动时向 TableView 添加更多数据并从 TableView 中删除不再需要的数据