簡體   English   中英

Java日期+日歷給出的結果與預期不同

[英]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

UTC與DST

因為java.util.Date可在UTC中使用。 但是,當生成日期時間值的String表示形式時,其toString方法會混淆您的JVM的當前默認時區。

我想您的JVM當前的默認時區是夏令時(DST),因此是小時調整。

24小時制

另外,您的小時代碼應為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM