Java 如何计算UTC时间和本地时间之间的差异

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

我试图从UTC时间戳中获取本地时间并计算偏移量。 我有一个UTC时间=1484063246 这是我的密码

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(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 小心“本地”这个词 在Java日期时间类中,单词
local
LocalDate
LocalTime
一样,表示任何位置,没有特定的位置。这些类故意没有时区或偏移的概念。在这个问题上,绝对不是你想要的

避免遗留日期时间类 使用java.time类是正确的,并且朝着正确的方向前进,但是不必要地涉及旧的遗留类

避免使用旧的遗留日期时间类(
date
Calendar
SimpleDateFormat
等),因为它们已被证明是令人困惑的、设计拙劣的和麻烦的。现在被班级取代了

使用java.time 该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

您的输入似乎是一个自计数

请注意,Java允许数字文本中的下划线,以便于人类阅读

Instant instant = Instant.ofEpochMilli( 1_484_063_246L );
你可以登广告
int offsetInSeconds = zoneOffset.getTotalSeconds() ;