使用 Android 获取 GMT 时间

Posted

技术标签:

【中文标题】使用 Android 获取 GMT 时间【英文标题】:Getting GMT time with Android 【发布时间】:2011-08-26 06:33:33 【问题描述】:

我在 *** 中一直在研究这个问题一段时间 android get Current UTC time 和 How can I get the current date and time in UTC or GMT in Java?

我尝试了两种方法来获取我手机的当前时间(格林威治标准时间)。我在西班牙,时差是 GMT+2。所以让我们看一个例子: 1º attemp:我创建了一个格式并将其应用于 System.currentTimeMillis();

    DateFormat dfgmt = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");   
    dfgmt.setTimeZone(TimeZone.getTimeZone("GMT")); 
    String gmtTime = dfgmt.format(new Date());
    //Using System.currentTimeMillis() is the same as new Date()
    Date dPhoneTime = dfgmt.parse(gmtTime);
    Long phoneTimeUTC = dPhoneTime.getTime();

我需要将那个时间减去另一个时间,这就是我对 Long 进行演员表的原因。

    DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");          
    Date arrivalDate = df.parse(item.getArrivalDate());
    //the String comes from JSON and is for example:"UTC_arrival":"2011-05-16 18:00:00"
    //which already is in UTC format. So the DateFormat doesnt have the GMT paramater as dfgmt
    diff = arrival.getTime() - phoneTimeUTC ;

我也试过这个:

    Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    Long phoneTimeUTC = aGMTCalendar.getTimeInMillis()

我仍然没有得到正确的区别。但如果我这样做:

    Long phoneTimeUTC = aGMTCalendar.getTimeInMillis()-3600000*2;

确实可以。

有什么想法吗?

非常感谢,

大卫。

【问题讨论】:

【参考方案1】:

这肯定有效!

        SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
        dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
        System.out.println(dateFormatGmt.format(new Date())+"");

指定格式,您将获得 GMT 格式!

【讨论】:

【参考方案2】:

据我阅读的 calendar.getTimeInMillis();返回以毫秒为单位的 UTC 时间。我使用了以下代码并将其与本站 http://www.xav.com/time.cgi 中的 Epoch 进行了比较。

public int GetUnixTime()

    Calendar calendar = Calendar.getInstance();
    long now = calendar.getTimeInMillis();
    int utc = (int)(now / 1000);
    return (utc);


乔拉

【讨论】:

-1: getInstance() 明确指出:“构造适合默认区域设置和默认时区的日历子类的新实例。”。可能Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() 会更好用 @patrickf Calendar 的时区无关紧要(不仅因为聪明的程序员不再使用Calendar)还因为getTimeInMillis() 返回相同的毫秒数,而与时区无关. @OleV.V.很公平,不是超级直观,但 javadoc 显然同意你的说法 @patrickf 真正的问题/混乱的根源是 Calendar 类的糟糕设计,一个类中塞满了太多的责任,以及其他问题。 My answer 展示了一种完全避免使用该类的方法。【参考方案3】:
     Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
     Date currentLocalTime = cal.getTime();
     DateFormat date = new SimpleDateFormat("dd-MM-yyy HH:mm:ss z");   
     date.setTimeZone(TimeZone.getTimeZone("GMT")); 
     String localTime = date.format(currentLocalTime); 
     System.out.println(localTime);

看看是否可行。

【讨论】:

我应该使用 String localTime = date.format(new Date()); 获取 currentLocaltime对吗?? 我用过这个'code' DateFormat dfgmt = new java.text.SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z"); dfgmt.setTimeZone(TimeZone.getTimeZone("GMT"));字符串 gmtTime = dfgmt.format(new Date().getTime());日期 dPhoneTime = dfgmt.parse(gmtTime);长电话时间 = dPhoneTime.getTime(); '代码',仍然没有运气 日历 cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); cal.add(日历.SECOND, 0);日期 currentLocalTime = cal.getTime(); DateFormat date = new SimpleDateFormat("dd-MM-yyy HH:mm:ss z"); date.setTimeZone(TimeZone.getTimeZone("GMT"));字符串 localTime = date.format(currentLocalTime); System.out.println(localTime);我刚刚运行了这个,它似乎对我来说很好,我在英国所以我把它改成 EST 来测试,看起来还可以 你好 Vade,我不是在寻找本地时间,而是寻找 UTC 时间。如果西班牙现在是 12.25,我想得到 10.25。使用您的代码,我仍然可以获取本地时间。 @Dayerman,对不起,我对你的意思有点困惑,上面的代码(编辑回复)在我的计算机上返回当前的 GMT 或 UTC -0 时间。每次运行代码时,我都尝试过多次将我的计算机时区调整为 utc+3 或 utc-2,但它仍然返回正确的 GMT 时间。例如,目前在英国(夏令时)是 11:30 所以 utc = 10:30 如果我将时间更改为 utc+3 它变为 14:30 但仍在运行该代码返回 10:30【参考方案4】:

你总是可以使用:

Calendar mCalendar = Calendar.getInstance(TimeZone.getTimeZone("gmt"));
long millies = mCalendar.getTimeInMillis();

Calendar mCalendar = Calendar.getInstance(TimeZone.getTimeZone("utc"));
long millies = mCalendar.getTimeInMillis();

【讨论】:

【参考方案5】:

输出:2016-08-01 14:37:48 UTC

    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

工作正常。

【讨论】:

但是系统如何知道我的 Date 对象来自哪个时区?如果我想将日期从 +2 时区转换为 GMT,反之亦然?【参考方案6】:

java.time 和 ThreeTenABP

我正在提供现代答案。

要获得现在(在西班牙或任何其他地方)的电话时间与过去某个时间之间的毫秒差异:

    // Example arrival time for the demonstration
    Instant arrival = Instant.parse("2020-02-29T12:34:56.789Z");
    Instant currentTime = Instant.now();
    long difference = ChronoUnit.MILLIS.between(arrival, currentTime);
    System.out.println("Difference is " + difference + " milliseconds");

示例输出:

相差 2610350731 毫秒

如果您想要以秒或其他时间单位为单位的差异,只需使用 ChronoUnit 枚举中的适当枚举常量而不是 ChronoUnit.MILLIS

无需担心设备时区,也无需担心格式化或解析时间,这些担心只会导致这个简单的事情过于复杂。

顺便说一句,时代是一个明确定义的时间点,它不随时区变化,全世界都一样。因此,从纪元到现在的毫秒数在所有时区中也是相同的。有人说这个计数始终以 UTC 为单位,因为(通常)以 UTC 定义纪元,如 1970 年 1 月 1 日 00:00 UTC。

问:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了 java.time。 ThreeTen Backport project,java.time 的向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 ThreeTenABP,Android 版 ThreeTen Backport Question: How to use ThreeTenABP in Android Project,解释得很透彻。

【讨论】:

以上是关于使用 Android 获取 GMT 时间的主要内容,如果未能解决你的问题,请参考以下文章

Android 从 GMT 毫秒获取 UTC 毫秒

如何以 GMT 格式获取今天的时间戳 - Kotlin

如何在 android 中将日期从 GMT 时区解析为 IST 时区和反之亦然

如何在 C# 中拒绝来自客户端的非 UTC/GMT 日期?

无法在android中以适当的格式获取日期

如何使用 GWT 获取 GMT 时间?