2014-10-31 66 views
4

如果我执行的GMT时区的计算机上以下日历返回日期错误的时区

TimeZone timeZone = TimeZone.getTimeZone('IST'); // India Standard Time 
Calendar calendar = Calendar.getInstance(timeZone); 

System.out.println(calendar.getTime()); 

它打印

周五10月31日十五时18分22秒格林尼治标准时间2014

为什么在计算机的默认时区打印日期,而不是TimeZoneCalendar是用?

+0

[为什么日历会在正确的时区返回错误的小时?](http://stackoverflow.com/questions/19299659/why-is-calendar-returning-the-wrong-hour-with正确的时区)和[this](http://stackoverflow.com/q/1516213/642706)和[this](http://stackoverflow.com/q/9410806/642706)和[this ](http://stackoverflow.com/q/14124701/642706)等等。 – 2014-11-02 01:48:46

回答

3

因为Date对象不具有时区作为其状态的一部分,你需要的SimpleDateFormat格式化和打印日期在您需要的时区

0

你有打印日期/时间之前申请时区

示例: TimeZone.setDefault(TimeZone.getTimeZone(“IST”));

(代码未测试)

0

Calendar#getTime() - 返回表示此日历的时间值(毫秒从Epoch.To偏移是精确的一个java.util.Date内的值是自毫秒数Date对象Unix纪元,发生在午夜1970年1月1日,UTC,并java.util.Date是没有具体的时间段。在另一方面

就可以达到你正在尝试以这种方式也

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("IST")); 
System.out.println(sdf.format(new Date())); 
1

当转换将Calendar对象转换为Date对象时区将丢失。日历本身使用时区。以下内容将打印到指定的时区。

TimeZone timeZone = TimeZone.getTimeZone('IST'); // India Standard Time 
Calendar calendar = Calendar.getInstance(timeZone); 

System.out.println(calendar.get(Calendar.DAY_OF_MONTH) + "/" + 
(calendar.get(Calendar.MONTH)+1) + "/" + calendar.get(Calendar.YEAR) + " Time: " + 
calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE)); 
System.out.println(calendar.getTime()); 

(注意不要使用日历API,这样,它很凌乱,使用日期格式API)

的日期API有许多问题(这就是为什么它在Java 8已经完全重做)。

5

Answer by Joshi正确但简短。我会扩大一点,并展示与现代课程的另一种选择。

Date没有时区

你的代码calendar.getTime()提取来自java.util.Calendar对象java.util.Date对象。

java.util.Date类有一个善意但易混淆的特性,其toString方法在生成字符串时应用JVM的当前默认时区。这产生了错觉,即Date类没有时区。 A Date表示自1970年UTC(1970-01-01T00:00:00Z)第一时刻的历元参考日期以来的时间线上的时刻,作为自毫秒的计数。 (更令人困惑的是,Date类实际上是确实有一个时间区域内部深陷,但是这个讨论无法达到并且无关紧要。)

避免遗留日期时类

旧日期,时间类现在是传统,由java.time类取代。而只使用java.time类。

Instant

对于UTC片刻,相当于java.util.Date,使用Instant类。 Instant类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数点后最多九(9)位数字)。

Instant instant = Instant.now(); // Current moment in 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); 

关于此主题的许多其他问题和解答的搜索堆栈溢出。这个问题实际上是许多其他问题的重复。


关于java.time

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,YearQuartermore