簡體   English   中英

為什么 Calendar 和 SimpleDateFormat 顯示錯誤的日期?

[英]Why Calendar and SimpleDateFormat are showing a bad date?

我嘗試從字符串中解析日期,但是當我打印它時,它顯示了一個錯誤的日期。 我的代碼:

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String args[]) {
        String some_date = "2017-12-31";
        Calendar cal_aux = GregorianCalendar.getInstance();
        System.out.println("set calendar: " + Integer.parseInt(some_date.substring(0, 4))
                + Integer.parseInt(some_date.substring(5, 7))
                + Integer.parseInt(some_date.substring(8, 10)));
        cal_aux.set(Integer.parseInt(some_date.substring(0, 4)),
                Integer.parseInt(some_date.substring(5, 7)),
                Integer.parseInt(some_date.substring(8, 10)));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("sdf calendar: " + sdf.format(cal_aux.getTime()));
    }
}

控制台輸出:

set calendar: 20171231
sdf calendar: 2018-01-31 12:51:02

為什么當我使用簡單的日期格式時,我得到的是 2018 年而不是 2017 年?

避免現在被 java.time 類取代的遺留日期時間類。 有問題的遺留類有許多設計缺陷。 一個這樣的錯誤是將月份計算為 0-11 而不是 1-12。 這種瘋狂的計數正在破壞您的代碼。

不要將日期時間值作為字符串進行操作。 使用對象。

對於該僅限日期的值,請使用LocalDate

LocalDate ld = LocalDate.parse( "2017-12-31" )  ;  // Or LocalDate.now() for today's date.

使用DateTimeFormatter生成字符串。

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;

20171231

如果需要,分配一天中的時間。

LocalTime lt = LocalTime.of( 6 , 15 ) ;
LocalDateTime ltd = LocalDateTime.of( ld , lt ) ;

如果您想要一個實際時刻,即時間軸上的特定點,請應用時區。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

首先,您設置了錯誤的日期,因為月份范圍是 0-11。 當您在月份字段中設置 12 時,是 2018 年 1 月而不是 2017 年 12 月。

其次,您可以簡化程序,將輸入字符串解析為格式化日期並將此日期解析為輸出格式化字符串。 下面是一個例子:

String input = "20171231";
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
    System.out.println(outputFormat.format(inputFormat.parse(input)));
} catch (ParseException e) {
    // Log error
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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