代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

如何在特定时区内获取日期?

  •  0
  • Mahmoud Saleh  · 技术社区  · 14 年前

    问候大家 我正在使用以下方法获取GMT时区中的当前时间

    public static Timestamp getCurrentTimeGMT() {
    
            Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
            long time = c.getTimeInMillis();
            long offset = TimeZone.getDefault().getOffset(time);
            return new Timestamp(time - offset);
    
        }
    

    但当我试图用同样的方法,稍作改动,得到格林威治标准时间+3的当前时间时 它给了我和格林尼治标准时间相同的结果?我不知道为什么:

    public static Timestamp getCurrentTimeGMT3() {
    
        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"));
        long time = c.getTimeInMillis();
        long offset = TimeZone.getDefault().getOffset(time);
        return new Timestamp(time - offset);
    
    }
    

    你知道为什么上面的代码不能正常工作吗?你知道怎么做吗?

    5 回复  |  直到 8 年前
        1
  •  4
  •   Jon Skeet    14 年前

    Timestamp 延伸 Date -它不 概念上的时区。它只是时间上的一个瞬间。

    如果要在具有特定时区的特定日历中显示,这是一个格式问题。使用相关时区创建适当的日历,并相应地在其中设置时间戳。

    (正常情况下,我建议您使用 Joda Time 而不是尽可能内置的API。更干净。)

        2
  •  2
  •   BruteForce    14 年前

    为什么要从最后一行的时间中减去偏移量?这基本上是将你的时间重置回格林尼治标准时间。你得到格林尼治标准时间+3,然后从中减去3小时。

        3
  •  2
  •   Michael Borgwardt    14 年前

    乔恩说了什么。时间戳没有时区,它始终是UTC,实际上不应该滥用它来表示本地时间。如果您真的需要对象来表示本地时间,joda time has a class for that .

    你应该知道“GMT+3”不是一个真正有效的时区。时区不仅有一个基准偏移量,而且还有一个夏令时偏移量,对于具有相同基准偏移量的时区,这一偏移量可能不同,甚至可能因立法而改变同一时区。实时区域ID是“欧洲/柏林”或“澳大利亚/达尔文”。

        4
  •  0
  •   jarnbjo    14 年前

    c.getTimeInMillis() 返回自1970年1月1日0:00 UTC以来的毫秒数,并且无论日历实例中使用的时区是什么,都将返回相同的值。

    如果创建具有时区的日历并需要访问时间字段,则应直接访问这些字段:

    int h = c.get(Calendar.HOUR_OF_DAY);
    int m = c.get(Calendar.MINUTE);
    int s = c.get(Calendar.SECOND);
    
        5
  •  0
  •   Tang Chanrith    8 年前

    使用时区静态方法。

    TimeZone default = TimeZone.getDefault();
    
    TimeZone.setDefault(TimeZone.getTimeZone("GMT+3"));
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date(System.currentTimeMillis()));
    Date date = cal.getTime(); // converted date time
    System.out.println(date.toString());
    
    // Set Back to System Default
    TimeZone.setDefault(default);