Android 从 GMT 毫秒获取 UTC 毫秒

Posted

技术标签:

【中文标题】Android 从 GMT 毫秒获取 UTC 毫秒【英文标题】:Android get UTC milliseconds from GMT milliseconds 【发布时间】:2013-07-28 23:03:49 【问题描述】:

我有一个 GMT 时间变量,我将转换为 UTC。我发布我的代码:

long mytime = 1376824500000;
Date date = new Date(mytime);
String time = new SimpleDateFormat("HH:mm").format(date);

这在某些设备中返回 "13:15",但我希望始终拥有 UTC 日期:"11:15"。 我该怎么做?

【问题讨论】:

将时区设置为 GMT。顺便说一句,与大多数语言一样,Java 不支持闰秒,因此 UTC 实际上映射到 GMT。 【参考方案1】:

尚不清楚您期望 UTC 和 GMT 之间有什么区别 - 就我们在这里讨论的目的而言,它们是等价的。 (它们在技术上并不完全相同,但是...)

格式化而言,您只需要在格式化程序上设置时区即可:

// TODO: Consider setting a locale explicitly
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
String time = format.format(date);

【讨论】:

非常感谢!我没有设置时区。在某些设备中,我得到 GMT+2.00 格式的值,在其他设备中,我得到 utc 值。谢谢。 @Tenaciousd93:是的,你没有设置时区,所以你得到的是本地时区。如果您想要 UTC 时区,则需要明确说明。【参考方案2】:

试试这个:

long mytime = 1376824500000;
Date date = new Date(mytime);
SimpleDateFormat formater = = new SimpleDateFormat("HH:mm");
formater .setTimeZone(TimeZone.getTimeZone("GMT"));
String time formater.format(date);

【讨论】:

【参考方案3】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

使用现代日期时间 API java.time 的解决方案:

import java.time.Instant;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneOffset;

public class Main 
    public static void main(String[] args) 
        Instant instant = Instant.ofEpochMilli(1_376_824_500_000L);
        OffsetDateTime odtUtc = instant.atOffset(ZoneOffset.UTC);
        LocalTime time = odtUtc.toLocalTime();
        System.out.println(time);

        // If you want the time with timezone offset
        OffsetTime ot = odtUtc.toOffsetTime();
        System.out.println(ot);
    

输出:

11:15
11:15Z

ONLINE DEMO

输出中的Z 是零时区偏移的timezone designator。它代表 Zulu 并指定 Etc/UTC 时区(时区偏移量为 +00:00 小时)。

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。

【讨论】:

以上是关于Android 从 GMT 毫秒获取 UTC 毫秒的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UTC 的偏移量(毫秒?

获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒? [复制]

以毫秒为单位获取以毫秒为单位的午夜纪元时间

如何使用JavaScript获取当前日期高达毫秒?

关于日期的处理

JS:如何获取时区