代码之家  ›  专栏  ›  技术社区  ›  George

如何使日期区域独立?

  •  4
  • George  · 技术社区  · 15 年前

    我有一个数据库,它把日期存储在 OleDateTime 格式,以格林尼治标准时区为单位。我已经实现了一个类,扩展 Date 在Java中以经典日期格式表示。但是我的课程是根据地区而定的(我在格林威治标准时间+2)。因此,它将数据库中的日期转换为 date - 2 hours . 如何正确转换日期?我希望我的课程是独立于区域设置的,总是使用GMT时区。实际上,问题是:

    class MyOleDateTime extends Date {
    
        static {
            Locale.setDefault(WhatGoesHere?)
        }
    
        // ... some constructors
        // ... some methods
    }
    
    5 回复  |  直到 11 年前
        1
  •  7
  •   Alexander Temerev    15 年前

    嗯,最好像其他答案中建议的那样使用日历对象。但是,如果你 真的? 要设置全局时区,可以使用 TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 在应用程序代码的早期。还有 user.timezone Java系统属性。

    而且(很有趣地知道),似乎只有利比里亚是按照格林尼治标准时间/世界时标准时间(没有日光节约)生活的国家。

    事实上, Date 对象本身是 总是 与区域和时区无关。它的 getTime() 方法将始终返回自1970年1月1日00:00:00以来经过的毫秒数(不计算闰秒) 在UTC中 . 但是如果你想得到毫秒以外的东西,你必须使用 Calendar ,其中 时区相关。但这是正确的方式。在 日期 上课,是吗?

        2
  •  6
  •   Jesper    15 年前

    正如Michael Borgwardt已经说过的,Java Date 对象不知道任何有关时区的信息。从1970年1月1日00:00:00 UTC开始,它只是一个毫秒数的包装器。

    只有当您将 日期 对象到 String 使用 DateFormat . 你把时区设置在 日期格式 指定要在哪个时区中查看 日期 .

    DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    
    String text = df.format(date);  // text will contain date represented in UTC
    
        3
  •  2
  •   Michael Borgwardt    15 年前

    日期 与地区无关,始终使用GMT时区。它只是一个在格林尼治标准时间(更准确地说,是UTC)中大约毫秒时间戳的包装器。

    里面唯一的东西 Date 这些依赖于时区的方法是不推荐使用的方法,例如 getDay() -这就是他们被否决的原因。它们使用默认时区。正确的做法是避免使用那些不推荐使用的方法- 将默认时区设置为UTC!这可能会在其他地方引起问题,并且不能阻止代码的其他部分将默认时区设置为其他值。

        4
  •  0
  •   kgiannakakis    15 年前

    使用A Calendar 对象:

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                                        locale);
    
        5
  •  0
  •   huzeyfe koriander    11 年前

    这是我用来计算格林尼治标准时间与 Calendar 实例并格式化它。我感谢我从这个网站得到的所有帮助,很高兴能为您做出贡献。我希望这能帮助别人。享受。

    Calendar calInst = Calendar.getInstance();
    
    //calculate the offset to keep calendar instance GMT
    int gmtOffsetMilli = calInst.get(Calendar.ZONE_OFFSET);
    long gmtOffsetHr = TimeUnit.HOURS.convert(gmtOffsetMilli, TimeUnit.MILLISECONDS);
    
    calInst = Calendar.getInstance(TimeZone.getTimeZone("GMT " + gmtOffsetHr));