【问题标题】:server time zone java conversion服务器时区java转换
【发布时间】:2011-11-20 02:44:12
【问题描述】:

好的,所以我几乎尝试了所有方法。我敢打赌这很简单,但我似乎无法掌握它。

服务器向我发送时间,即纪元。但是,当我将其放入日期对象时,它似乎会自动选择时区,并将 +3 添加到服务器时间。因此,如果 gmt 时间为 00.00,则表示其为 03.00。

我还需要添加自己的时区。假设纪元时间再次为 00.00,添加时区后它应该为 10.00。

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: java android date timezone


    【解决方案1】:

    “似乎添加了”-我怀疑您使用的是Date.toString(),它确实使用了本地时区。 Date 对象本身实际上是 UTC。改为使用DateFormat 执行转换为字符串,您可以指定要使用的时区。您可能还需要使用Calendar - 这取决于您要执行的操作。

    (或者,首先使用Joda Time,这是一个更好的API。不过,它对于您的Android项目可能有点笨重。如果周围有“Joda Time lite”项目,我不会感到惊讶正是这种事情的某个地方......)

    编辑:快速示例,虽然并不完全清楚您需要什么...

    long millis = getMillisFromServer();
    Date date = new Date(millis);
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    format.setTimeZone(customTimeZone);
    String formatted = format.format(date);
    

    【讨论】:

    • 我能举个例子吗?我需要将它与其他东西进行比较
    • @Hades:现在已经添加了一个,虽然还不完全清楚你要做什么,或者你需要什么格式。
    • 假设这是我从服务器“1316391494”得到的,我想将其转换为澳大利亚时间......我该如何去做......使用 Joda Time 或标准日期工具。
    • @Hades:看起来以秒为单位 - 您需要做的第一件事是将值乘以 1000。然后使用适当的澳大利亚时区将其输入到上面的代码中,它应该没事。
    【解决方案2】:

    java.time

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

    另外,下面引用的是来自home page of Joda-Time的通知:

    请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

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

    import java.time.Instant;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            long millis = 1316391494L;
    
            Instant instant = Instant.ofEpochMilli(millis);
            System.out.println(instant);
    
            // The same instant at a specific timezone
            ZonedDateTime zdt = instant.atZone(ZoneId.of("Australia/Brisbane"));
            System.out.println(zdt);
        }
    }
    

    输出:

    1970-01-16T05:39:51.494Z
    1970-01-16T15:39:51.494+10:00[Australia/Brisbane]
    

    ONLINE DEMO

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

    您的代码出了什么问题?

    java.util.Date 对象仅表示时间轴上的一个瞬间 — 自 UNIX 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的毫秒数的包装。由于它不保存任何时区信息,它的 toString 函数应用 JVM 的时区以返回格式为 EEE MMM dd HH:mm:ss zzz yyyyString,该格式派生自 毫秒 值。要以不同的格式和时区获取 java.util.Date 对象的 String 表示,您需要使用具有所需格式和适用时区的 SimpleDateFormat,例如

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    import java.util.TimeZone;
    
    public class Main {
        public static void main(String[] args) {
            long millis = 1316391494L;
            Date date = new Date(millis);
    
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX[zzzz]", Locale.ENGLISH);
    
            sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
            String strDateUtc = sdf.format(date);
            System.out.println(strDateUtc);
    
            sdf.setTimeZone(TimeZone.getTimeZone("Australia/Brisbane"));
            String strDateBrisbane = sdf.format(date);
            System.out.println(strDateBrisbane);
        }
    }
    

    输出:

    1970-01-16T05:39:51.494Z[Coordinated Universal Time]
    1970-01-16T15:39:51.494+10:00[Australian Eastern Standard Time]
    

    ONLINE DEMO


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

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2014-11-11
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多