2017-02-19 22 views
0

我的代码:日历在Java中不工作的UTC时区

TimeZone timeZone = TimeZone.getTimeZone("UTC"); 
Calendar cal = (Calendar) Calendar.getInstance(timeZone); 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
System.out.println("Gregorian cal time:"+cal.getTime()); 
System.out.println("utc time: "+simpleDateFormat.format(cal.getTime())); 

两个打印报表显示相同的本地时间。

+2

为什么他们不应该?你正在使用相同的(默认)时区格式化相同的Date('cal.getTime()')。所以得到相同的结果是正常的。你想达到什么目的? –

+0

但是,我想要UTC时间。正如我提到的时区,它应该显示UTC时间。 –

+0

2个打印语句之间的唯一区别是其中一个打印语句获取某些字符串格式 - 实际上没有任何关于日期发生变化的内容。 – csmckelvey

回答

0
LocalDateTime utc_time = LocalDateTime.now(ZoneId.of("UTC")); 
System.out.println("Date: "+utc_time); 

工作正常

+0

该问题询问UTC中的值。所以**在这里使用['LocalDateTime'](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html)是不正确的**,因为该类的目的是故意有* no *抵消或时区。根据定义,'LocalDateTime'不能用UTC。 'LocalDateTime'甚至不是实际的时刻,它不是*时间轴上的一个点。你的变量名LocalDateTime utc_time是一个矛盾的词。 –

1

你需要设置你的DateFormatter的时区为 “UTC”

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println("utc time: "+simpleDateFormat.format(cal.getTime())); 
0

TL;博士

Instant.now() 

避免遗留日期时类

您正在使用麻烦的旧日期时间类,现在是遗留的,由java.time类代替。遗留的课程是一个糟糕的设计,混乱和缺陷。避免它们。

Instant

Instant类表示UTCnanoseconds(最多9个(9)小数的位数)的分辨率在时间轴上的力矩。

Instant instant = Instant.now(); 

instant.toString():2017-02-23T03:30:58.431Z

toString由生成的字符串的格式是标准ISO 8601格式。末尾的ZZulu的缩写,意思是UTC

就是这样,你完成了。

ZonedDateTime

如果你想看到的是相同的时刻,一些特定地区的wall-clock time,然后应用ZoneId得到ZonedDateTime

continent/region的格式指定一个proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = instant.atZone(z); 

zdt.toString():2017-02-23T09:00:58.431 + 05:30 [亚/加尔各答]

印度是五个半小时比UTC的。因此,当调整为Asia/Kolkata时区时,请注意日期时间如何从03:30跳至09:00


关于java。时间

java.time框架内置于Java 8及更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可能会在此找到一些有用的类别,例如Interval,YearWeek,YearQuarter和fz more