[英]Java Date + Calendar giving different results than expected
我有以下代碼:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {
try {
Calendar calendar = Calendar.getInstance();
Date _date = new SimpleDateFormat("ddMMyyyy").parse("13102014");
Date _time = new SimpleDateFormat("hhmmss").parse("201100");
calendar.setTimeInMillis(_date.getTime() + _time.getTime());
System.out.println(calendar.getTime()); // NOK 1 hour less
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
為什么會產生:
2014年10月13 日星期一19:11:00
代替:
2014年10月13 日星期一20:11:00
因為java.util.Date可在UTC中使用。 但是,當生成日期時間值的String表示形式時,其toString
方法會混淆您的JVM的當前默認時區。
我想您的JVM當前的默認時區是夏令時(DST),因此是小時調整。
另外,您的小時代碼應為24小時的HH
,而不是12小時的hh
。
我想說,通過簡單的更改就可以產生所需的輸出。 無需JODA或Java 8。 我不明白您為什么要像以前那樣寫。
package cruft;
/**
* CalendarTest description here
* @author Michael
* @link https://stackoverflow.com/questions/26348140/java-date-calendar-giving-different-results-as-expected
* @since 10/13/2014 4:16 PM
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {
try {
Calendar calendar = Calendar.getInstance();
Date _date = new SimpleDateFormat("ddMMyyyy hhmmss").parse("13102014 201100");
calendar.setTimeInMillis(_date.getTime());
System.out.println(calendar.getTime());
} catch (ParseException e1) {
e1.printStackTrace();
}
}
}
這是我得到的輸出:
"C:\Program Files\Java\jdk1.7.0_45\bin\java" -Didea.launcher.port=7536 "
Mon Oct 13 20:11:00 EDT 2014
Process finished with exit code 0
當您僅將時間與日期分開解析時,它將視為該時間發生在1970年1月1日。這是冬天,您使用標准時間。 因此,將兩者結合在一起時,將獲得標准時間的值,該時間比當前的壁鍾時間(夏令時)晚一小時。
眾所周知,java.util.Date和.Calendar類很麻煩。 避免他們。 請改用合格的日期時間庫。 在Java中,這意味着:
在Joda-Time中, DateTime
對象知道其自己分配的時區(與juDate不同)。
您的Question中的字符串格式令人討厭。 如果可能,請替換為ISO 8601標准字符串。 標准字符串更具可讀性和直觀性。 此外,Joda-Time和java.time都默認解析並生成標准字符串。
使用Joda-Time 2.5的示例代碼。 我們不知道您的時區,所以我任意選擇柏林。 我假設您的輸入字符串表示該時區中的某個時刻,盡管您的問題不明確。
解析輸入字符串。
String input = "13102014201100";
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "ddMMyyyyHHmmss" );
DateTimeFormatter formatterBerlin = formatter.withZone( timeZone );
DateTime dateTimeBerlin = formatterBerlin.parseDateTime( input );
調整到另一個時區。 在這種情況下,為UTC 。
DateTime dateTimeUtc = dateTimeBerlin.withZone( DateTimeZone.UTC );
轉儲到控制台。
System.out.println( "input: " + input );
System.out.println( "dateTimeBerlin: " + dateTimeBerlin );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
運行時。
input: 13102014201100
dateTimeBerlin: 2014-10-13T20:11:00.000+02:00
dateTimeUtc: 2014-10-13T18:11:00.000Z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.