簡體   English   中英

Java GregorianCalendar欄位

[英]Java GregorianCalendar Fields

我嘗試將String轉換為GregorianCalendar,然后檢查它。 在下面,我發布我的代碼。 我真的感到困惑,為什么這些字段看起來不對。 非常感謝您的幫助。

public class test{

    private static final ArrayList<String> MONTH_OF_YEAR = new ArrayList(Arrays.asList( "Jan", "Feb", "Mar", "Apr", "May", 
          "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"));

    static GregorianCalendar date;

    public static void main(String[] args){
        String t = "28-Mar-2099 11294.94 11279.65";
        String[] splitStr = t.split(" ");

        System.out.println(splitStr[0]);

        date = ConvertToDate(splitStr[0]);
        System.out.println(date.getTime());

        System.out.println(date.DAY_OF_MONTH);
        System.out.println(date.MONTH);
        System.out.println(date.YEAR);

    }


    private static GregorianCalendar ConvertToDate(String dt){
        String[] splitStr = dt.split("-");
        if(splitStr.length != 3){
            throw new IllegalArgumentException();
        }
        int dayOfMonth = Integer.parseInt(splitStr[0]);
        int year = Integer.parseInt(splitStr[2]);
        int month = MONTH_OF_YEAR.indexOf(splitStr[1]);
        if(month < 0 || month > 11){
            throw new IllegalArgumentException();
        }
        return new GregorianCalendar(year, month, dayOfMonth);
    }
}

輸出如下:

28-Mar-2099
Sat Mar 28 00:00:00 PDT 2099
5
2
1

誰能幫我解釋為什么這些字段與日期不匹配?

這些:

System.out.println(date.DAY_OF_MONTH);
System.out.println(date.MONTH);
System.out.println(date.YEAR);

應該:

System.out.println(date.get(Calendar.DAY_OF_MONTH));
System.out.println(date.get(Calendar.MONTH));
System.out.println(date.get(Calendar.YEAR));

(然后記住Calendar.MONTH是從0開始的。)

DAY_OF_MONTH等值是常量,基本上指示要獲取的字段。 不幸的是,日歷API從根本上是很糟糕的:(如果可以使用Joda Time或Java 8 java.time API來代替,它們都更好。

另外請注意,實際上不需要編寫自己的日歷解析代碼SimpleDateFormat等中已經存在該解析代碼。

TL;博士

LocalDate.parse(
    "28-Mar-2099 11294.94 11279.65".split( " " )[0] ,        // Extract the part of the input text we care about.
    DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) // Specify formatting pattern to match input. The `Locale` determines human language and cultural norms needed for parsing.
).getYear() // .getMonthValue() .getDayOfMonth()             // Interrogate for the parts of the date you desire.

java.time

現代方法使用java.time類代替了麻煩的舊日期時間類。 GregorianCalendar類被ZonedDateTime取代。

您需要一個僅日期的值,沒有日期和時區。 因此,請使用LocalDate

提取我們關心的部分輸入。

String[] pieces = "28-Mar-2099 11294.94 11279.65".split( " " );
String input = pieces[0] ;

定義格式模式以匹配該輸入。 順便說一句,在可能的情況下,請盡可能使用標准的ISO 8601格式來交換日期時間值,而不要使用此處遇到的格式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

提取日期的任何部分。

int year = ld.getYear() ;
Month month = ld.getMonth() ;  // An enum object from `Month` enum class.
int monthNumber = ld.getMonthValue() ;
int dayOfMonth = ld.getDayOfMonth() ;

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

使用兼容JDBC 4.2或更高版本的JDBC驅動程序 ,您可以直接與數據庫交換java.time對象。 不需要字符串或java.sql。*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

暫無
暫無

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

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