【发布时间】:2021-03-23 01:40:12
【问题描述】:
服务器正在使用 System.currentTimeMillis() 存储客户端操作的日期/时间。假设此服务器位于 EST 时区。
法国的一位客户想查看该操作是在什么时间进行的。通过 System.currentTimeMillis()(在美国服务器上)存储的长值返回给法国的客户端。
我在理解如何在客户端进行转换以准确描述他们的操作时间时遇到问题。我的理解是,在服务器上 System.currentTimeMillis() 是一个无区域的 UTC 时间。当我用“UTC”时区实例化一个日历对象时,事情似乎很奇怪,当服务器使用 currentTimeMillis() 保存时,它存储一个时区的纪元时间也是如此
第一次尝试:
String timezone = clientTimezone;//Lets say france
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time); //This time var is the server stored value (currentTimeMillis)
if(!timezone.equals("")) {
long timezoneAlteredTime = time + TimeZone.getTimeZone(timezone).getRawOffset();
cal = Calendar.getInstance(TimeZone.getTimeZone(timezone));
cal.setTimeInMillis(timezoneAlteredTime);
}
其他尝试:
String timezone = clientTimezone;//Lets say france
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar cal = Calendar.getInstance(utc);
cal.setTimeInMillis(time); //This time var is the server stored value
if(!timezone.equals("")) {
long timezoneAlteredTime = time + TimeZone.getTimeZone(timezone).getRawOffset();
cal = Calendar.getInstance(TimeZone.getTimeZone(timezone));
cal.setTimeInMillis(timezoneAlteredTime);
}
我完全误解了这个问题吗?您将如何进行此转换
【问题讨论】:
-
您不应该进行任何转换。自纪元以来的毫秒数(从
System.currentTimeMillis()开始)在世界各地都是相同的,并且与时区无关。因为 eopch 是一个时间点,所有时区的同一时间点(而不是一天中的同一时钟时间)。 -
我建议你不要使用
Calendar和TimeZone。这些课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time API 的ZonedDateTime和ZoneId。
标签: java date calendar timezone epoch