2014-09-10 53 views
0

我正在嘗試使用Java讀取CST時區中的系統日期。我嘗試了下面的代碼,但每當我使用formatter.parse()它都會在EST時區返回時間。使用Java在CST時區讀取系統時間

private Date getTodayInCST() { 
    Calendar currentdate = Calendar.getInstance(); 
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    TimeZone obj = TimeZone.getTimeZone("CST"); 
    formatter.setTimeZone(obj); 

    String today = formatter.format(currentdate.getTime()); 
    try { 
     return formatter.parse(today); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+3

A Date沒有時區信息,所以你試圖做的事是不可能的。不過,您可以*打印*具有給定時區設置的日期。 – assylias 2014-09-10 14:20:22

+0

可能的重複[如何設置時區的java.util.Date?](http://stackoverflow.com/questions/2891361/how-to-set-time-zone-of-a-java-util-日期) – 2014-09-10 15:46:27

+0

它可能不會在EST中返回日期。我們現在正在C *** D *** T,其中的時間比CST晚1個小時。如果你正在閱讀的時間是CDT,那麼輸出將看起來像EST。 – 2014-09-10 15:59:59

回答

0

java.util.Date對象本身不包含任何時區信息 - 你不能設置時區的Date對象。 Date對象包含的唯一東西是1970年1月1日00:00:00 UTC以來的「紀元」以來的毫秒數。

如果你想設置時區嘗試這樣

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
format.setTimeZone(TimeZone.getTimeZone("CST")); 
System.out.println(format.format(new Date())); 
+0

謝謝你們工作。 – 2014-09-11 05:31:45

1

如果想代碼提供當前的時間考慮夏令從CST調整到CDT或反之亦然,你可以使用 「 CST6CDT「時區。代替SimpleDateFormat中的「CST」。

SimpleDateFormat cstCdtFormat=new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
cstCdtFormat.setTimeZone(TimeZone.getTimeZone("CST6CDT")); 
System.out.println(cstCdtFormat.format(new Date())); 
0

TL;博士

ZonedDateTime.now( 
    ZoneId.of("America/Chicago") 
) 

詳細

我想讀的CST時區

通過「CST」系統日期,你的意思北美中部標準時間中國標準時間

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。請勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的,如上面的CST所示。

ZoneId z = ZoneId.of("America/Chicago") ; 

java.time

您正在使用的是現在傳統麻煩舊日期時間類。由提供java.times類。

以UTC獲取當前時刻。 Instant類表示UTC中的時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

Instant instant = Instant.now() ; 

2018-02-26T05:45:24.213610Z

調整到另一個時區。同一時刻,時間線上的同一點,不同的掛鐘時間。

ZonedDateTime zdt = instant.atZone(z) ; 

zdt.toString():2018-02-25T23:45:24。213610-06:00 [美國/芝加哥]

上述字符串採用標準的ISO 8601格式。 ZonedDateTime類明智地擴展了該標準以在方括號中附加區域的名稱。

如果要生成其他格式的String對象,請使用DateTimeFormatter

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss") ; 
String output = zdt.format(f) ; 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

使用JDBC driverJDBC 4.2或更高版本兼容的,你可以交換java.time直接對象與數據庫。不需要字符串和java.sql。*類。

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore