Java GregorianCalendar字段

时间:2015-05-30 05:39:35

标签: java calendar

我尝试将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

有人可以帮我解释为什么字段与日期不匹配吗?

2 个答案:

答案 0 :(得分:3)

这些:

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等。

答案 1 :(得分:0)

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

使用符合JDBC driver或更高版本的JDBC 4.2,您可以直接与数据库交换 java.time 对象。不需要字符串也不需要java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore