2017-07-28 118 views
1
int year = Integer.parseInt(sTransDateTime2.substring(0, 4)); 
int month = (Integer.parseInt(sTransDateTime2.substring(4, 6)) - 1); 
int day = Integer.parseInt(sTransDateTime2.substring(6, 8)); 
int hour = Integer.parseInt(sTransDateTime2.substring(8, 10)); 
int minute = Integer.parseInt(sTransDateTime2.substring(10, 12)); 
int second = Integer.parseInt(sTransDateTime2.substring(12)); 

System.out.println("year=" + year + "| month= " + month + "| day=" + day); 
DateFormat df = new SimpleDateFormat("mm/dd/yyyy"); 
Calendar calConvert = Calendar.getInstance(); 
calConvert.set(year, month, day, hour, minute, second); 
sTransDateTime2 = Long.toString(calConvert.getTimeInMillis()/1000); 
System.out.println("debug date: " + sTransDateTime2); 

我的日期時間是年= 2017 |月= 7 |天= 28 |小時= 17 |分鐘= 0, 轉換爲毫秒後,它變成15. 日期的結果是正確的,將在2017年7月28日,但時間變爲晚上9點。 我的編碼有問題嗎?日期和時間不能轉換爲毫秒

感謝

+0

你有沒有考慮使用Java庫,用於解析日期?例如SimpleDateParser? – nafas

+0

你代碼中的一個錯誤:格式字符串錯誤,應該是「MM/dd/yyyy」而不是「mm/dd/yyyy」。請注意,「mm」表示**分鐘**,而不是幾個月。使用'MM'數月。 (其實 - 爲什麼你有這個'SimpleDateFormat'對象呢?它甚至不用在你的代碼中)。 – Jesper

+0

也許你在一次轉換中使用本地TimeZone設置,但不在另一次轉換中。 –

回答

1

停止學習破舊java.date並移動到java.time

LocalDateTime myldt = LocalDateTime.of(2017, 7, 28, 17, 0); 
System.out.println(myldt); 
System.out.println(myldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); 
+0

我的服務器只使用java 6. –

+0

LocalDateTime的意思是將獲得當地時區?原因可能是時區不同 –

0

它看起來像轉換到毫秒被在一個時區完成,但系統上毫秒轉換爲日期在不同的時區。 28th July, 2017 17:00:00UTC+08:00時區給出時代爲15秒,但是從時代開始的這些秒在UTC+12:00時區中給出28th July, 2017 21:00:00

爲了說明上述情況,我在計算毫秒時明確將時區設置爲UTC+8:00。 (我已經把我的系統時區以UTC+12:00顯示輸出)

System.out.println("year=" + year + "| month= " + month + "| day=" + day); 
    Calendar calConvert = Calendar.getInstance(); 
    calConvert.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); 
    calConvert.set(year, month, day, hour, minute, second);  
    sTransDateTime2 = Long.toString(calConvert.getTimeInMillis()/1000); 
    System.out.println("debug date: " + sTransDateTime2); 
    System.out.println(new Date(calConvert.getTimeInMillis())); 

這使我的輸出如下:

year=2017| month= 6| day=28 
debug date: 15
Fri Jul 28 21:00:00 NZST 2017 

請注意,Date始終打印在本地時區的日期。因此,它已按照當地時區轉換毫秒,時間更改爲21:00

現在我格式化這個日期,以確保我得到的輸出只在UTC+08:00,無論是系統時區。

Date dt = calConvert.getTime(); 
DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
formatter.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); 
System.out.println(formatter.format(dt)); 

現在我得到的輸出爲:07/28/2017 17:00:00,而不是較早的日期與21:00隨着時間。

因此,結論是,您需要格式化要在特定時區顯示的日期,如果您想避免它獲取顯示它的系統的默認時區。

爲了避免所有繁瑣的代碼和令人困惑的問題,如其他答案中的建議,請參閱java.time API。 java.time可從JDK 8獲得。在使用JDK 6時,可以使用ThreeTen Backport。只是爲了說明有哪些事情可以用java.time來完成,下面做了同樣的代碼做什麼的緩解,但在一個簡潔和易於理解的方式:

ZonedDateTime zdt = ZonedDateTime.of(LocalDate.of(year, month, day), 
          LocalTime.of(hour, minute,second), ZoneId.of("Asia/Macau")); 
long secondsFromEpoch = zdt.toEpochSecond(); 

//To convert back 
ZonedDateTime zdtBack = Instant.ofEpochSecond(secondsFromEpoch) 
           .atZone(ZoneId.of("Asia/Macau")); 
System.out.println(zdtBack);