2017-07-28 18 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時になります。 私のコーディングに間違いがありますか?古い壊れたjava.dateを学習日付+時間はミリ秒に変換できません

おかげ

+0

あなたは日付を解析するためのJavaライブラリを使用して検討しています?例えばSimpleDateParser? – nafas

+0

あなたのコードで1つのエラーがあります:フォーマット文字列が間違っています。 'mm/dd/yyyy'の代わりに' MM/dd/yyyy'にする必要があります。 「mm」は、月数ではなく、**分**を意味することに注意してください。月には 'MM'を使います。 (実際には、なぜこのSimpleDateFormatオブジェクトを持っていますか?それはあなたのコードでも使われていません)。 – Jesper

+0

おそらく、1つの変換でローカルTimeZone設定を使用していて、他の変換では使用していない可能性があります。 –

答えて

1

停止し、ミリ秒への変換は1つのタイムゾーンで行われますが、上のシステムされているように見えます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:0015と秒を秒で返します。UTC+08:00時間帯ですが、これらの秒数は、28th July, 2017 21:00:00UTC+12: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に戻すようにこの日付をフォーマットします。 07/28/2017 17:00:00代わりの時間として21: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)); 

は今、私は出力を得ます。

結論として、表示されるシステムのデフォルトのタイムゾーンが表示されないようにするには、特定のタイムゾーンに表示する日付をフォーマットする必要があります。

煩わしいコードと混乱する問題を回避するには、他の回答に示唆されているように、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); 
関連する問題