Java 如何计算UTC时间和本地时间之间的差异
我试图从UTC时间戳中获取本地时间并计算偏移量。 我有一个UTC时间=1484063246 这是我的密码Java 如何计算UTC时间和本地时间之间的差异,java,date,Java,Date,我试图从UTC时间戳中获取本地时间并计算偏移量。 我有一个UTC时间=1484063246 这是我的密码 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("CET")); String formattedDate = dateFormat.format(new Date(14840
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("CET"));
String formattedDate = dateFormat.format(new Date(1484063246L * 1000L));
formattedDate正在以日期格式返回。如何根据这些值计算UTC时间和本地时间之间的差异。如何根据服务器运行的位置设置时区,而不是硬编码“CET”。获取当前时间戳(毫秒),然后从1484063246中减去。 从下面的例子开始。 您还需要检查偏移量是否为正/负
long now = System.currentTimeMillis();
long offset = now - 1484063246L * 1000;
Date date = new Date(offset);
DateFormat df = new SimpleDateFormat("HH:mm:ss");
System.out.println(df.format(date));
以毫秒为单位获取当前时间戳,并从1484063246中减去。 从下面的例子开始。 您还需要检查偏移量是否为正/负
long now = System.currentTimeMillis();
long offset = now - 1484063246L * 1000;
Date date = new Date(offset);
DateFormat df = new SimpleDateFormat("HH:mm:ss");
System.out.println(df.format(date));
如果我理解你的问题,你可以做(JSE>=1.8):
systemDefault()
返回系统默认(本地)区域ID和getOffset(即时)
返回指定瞬间从该区域到UTC的偏移量
e、 g
+01:00
欧洲/柏林
加拿大/纽芬兰的-02:30
Z
用于UTC
(注意任意数字转换!!)
看一看细节
编辑:删除了
Date
类的使用,因为它可以避免导入(正如Basil Bourque的回答所暗示的那样)。顺便说一句,Date
类很旧,但非常简单,从未弃用过。事实上,这是一个纯毫秒的简单抽象。如果我理解你的问题,你可以这样做(JSE>=1.8):
systemDefault()
返回系统默认(本地)区域ID和getOffset(即时)
返回指定瞬间从该区域到UTC的偏移量
e、 g
+01:00
欧洲/柏林
加拿大/纽芬兰的-02:30
Z
用于UTC
(注意任意数字转换!!)
看一看细节
编辑:删除了Date
类的使用,因为它可以避免导入(正如Basil Bourque的回答所暗示的那样)。顺便说一句,Date
类很旧,但非常简单,从未弃用过。事实上,这是一个纯毫秒的轻抽象。tl;博士
小心“本地”这个词
在Java日期时间类中,单词local
与LocalDate
,LocalTime
一样,表示任何位置,没有特定的位置。这些类故意没有时区或偏移的概念。在这个问题上,绝对不是你想要的
避免遗留日期时间类
使用java.time类是正确的,并且朝着正确的方向前进,但是不必要地涉及旧的遗留类
避免使用旧的遗留日期时间类(date
、Calendar
、SimpleDateFormat
等),因为它们已被证明是令人困惑的、设计拙劣的和麻烦的。现在被班级取代了
使用java.time
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
您的输入似乎是一个自计数
请注意,Java允许数字文本中的下划线,以便于人类阅读
Instant instant = Instant.ofEpochMilli( 1_484_063_246L );
您可以将其调整为时区,以查看某个区域的数据。以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或CET
或IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)
您可以询问()via,这似乎是您问题的重点。偏移量将随着时间的推移而变化,因为异常情况,例如。时区是过去、现在和近期的偏移量的集合。因此,当要求分区进行偏移时,必须指定一个时间点
ZoneOffset zoneOffset = zoneId.getRules().getOffset( instant );
如果需要,您可以获得偏移量
int offsetInSeconds = zoneOffset.getTotalSeconds() ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
local
与LocalDate
,LocalTime
一样,表示任何位置,没有特定的位置。这些类故意没有时区或偏移的概念。在这个问题上,绝对不是你想要的
避免遗留日期时间类
使用java.time类是正确的,并且朝着正确的方向前进,但是不必要地涉及旧的遗留类
避免使用旧的遗留日期时间类(date
、Calendar
、SimpleDateFormat
等),因为它们已被证明是令人困惑的、设计拙劣的和麻烦的。现在被班级取代了
使用java.time
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
您的输入似乎是一个自计数
请注意,Java允许数字文本中的下划线,以便于人类阅读
Instant instant = Instant.ofEpochMilli( 1_484_063_246L );
你可以登广告
int offsetInSeconds = zoneOffset.getTotalSeconds() ;