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

时间:2010-08-09 15:25:53

标签: java datetime timezone

所有的问候 我使用以下方法获取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);

    }

但当我尝试使用相同的方法进行微小更改以获得GMT + 3中的当前时间 它给了我与GMT相同的结果?我不知道为什么:

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);

}

任何想法为什么上面的代码不能正常工作,以及如何做这样的方法?

6 个答案:

答案 0 :(得分:4)

Timestamp扩展Date - 概念上它 时区。它只代表了一个瞬间。

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

(按照惯例,我建议您尽可能使用Joda Time而不是内置API。它更干净。)

答案 1 :(得分:2)

为什么从最后一行的时间减去偏移量?这基本上是将你的时间重新设置回GMT。您检索GMT + 3然后从中减去3小时。

答案 2 :(得分:2)

Jon说的话。时间戳没有时区,它始终是UTC,并且实际上不应该滥用来表示本地时间。如果你真的需要对象代表当地时间,Joda Time has a class for that

你应该知道“GMT + 3”不是真正有效的时区。时区不仅具有基本偏移,还具有夏令时偏移,对于具有相同基本偏移的时区,时区偏移可以不同,并且由于立法,甚至可以针对相同时区进行更改。实时区域ID是“Europe / Berlin”或“Australia / Darwin”。

答案 3 :(得分:0)

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

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

int h = c.get(Calendar.HOUR_OF_DAY);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);

答案 4 :(得分:0)

使用Timezone静态方法。

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);

答案 5 :(得分:0)

通过示例代码获取不同时区的时间

public class GetZoneDateTime {

public static void main(String[] args) throws Exception {
    String reqTzId = "Asia/Singapore";

    LocalDateTime now = LocalDateTime.now();
    System.out.println("Local Now: " + now + " TimeZone: " + TimeZone.getDefault());

    ZoneId zoneId = ZoneId.of(reqTzId);
    System.out.println("Req TimeZone : " + zoneId);

    LocalDateTime localNow = LocalDateTime.now(zoneId);
    System.out.println("tzLocalDateTime: " + localNow);

    ZonedDateTime zoneNow = ZonedDateTime.now(zoneId);
    System.out.println("tzZonedDateTime: " + zoneNow);
}

}