从字符串日期获取包含月份名称的周数

时间:2015-04-08 20:40:32

标签: java calendar

我有一个字符串,其中包含

形式的日期
  

04-JAN-15

并且需要获得一年中的周数。 对于上面的示例week 1(或者2取决于12月的区域设置和工作日。更别提。)

我有这个:

   String[] startDate=dates[0].split("-");    
   int month,day,year;
   year=2000+Integer.parseInt(startDate[2]);
   day=Integer.parseInt(startDate[0]);

   switch (startDate[1]){
    case "Jan": 
        {
            month=1;
            break;
        }
........
........
    case "Dec": 
        {
        month=12;
        break;
        }
    }

   Calendar temp=new GregorianCalendar();
   SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    try {

        Date tempDate = sdf.parse(day+"/"+month+"/"+year);
        System.out.println("DATE:"+tempDate);
        temp.setTime(tempDate);
        System.out.println("Calendar Month:"+temp.MONTH);
        System.out.println("Calendar Week:"+temp.WEEK_OF_YEAR);

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

返回

  

日期:Sun Jan 04 00:00:00 EET 2015

     

日历月:2

     

日历周:3

我试过(早些时候)这个

temp.set(year, month, day);

并且仍然得到错误的结果。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

TL;博士

文化定义的周...

LocalDate.parse( 
    "04-Jan-15" , 
    DateTimeFormatter.ofPattern( "dd-MMM-uu" , Locale.US )
).get( 
    WeekFields.of( Locale.FRANCE ).weekOfWeekBasedYear( ) 
)  // Gets week number for a culturally-defined week-of-year.

标准周......

LocalDate.parse( 
    "04-Jan-15" , 
    DateTimeFormatter.ofPattern( "dd-MMM-uu" , Locale.US )
).get( 
    IsoFields.WEEK_OF_WEEK_BASED_YEAR 
)  // Gets standard ISO 8601 week number.

java.time

您正在使用现在遗留下来的麻烦的旧日期时间类,完全由java.time类取代。现在解决你的问题要简单得多。

解析输入字符串。指定Locale以确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号,分隔符等问题的文化规范。

String input = "04-Jan-15";

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

转储到控制台。

System.out.println( "input: " + input + " = " + ld );

输入:04-Jan-15 = 2015-01-04

周数

周数是文化定义的。要访问一周中的某一年,您必须指定一个Locale,其文化要用于定义一周。

Locale locale = Locale.FRANCE;
WeekFields fields = WeekFields.of( locale );
TemporalField field = fields.weekOfWeekBasedYear( );
int weekNumber = ld.get( WeekFields.of( Locale.FRANCE ).weekOfWeekBasedYear( ) ); // Gets week number for a culturally-defined week-of-year.

ISO 8601定义standard week numbers,其中第1周包含一年中的第一个星期四,并在星期一开始。 java.time类在IsoFields类中提供了这种方法。

int weekNumber = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )  // Gets standard ISO 8601 week number.

ISO 8601

顺便说一句,输入字符串格式不好。将日期时间值作为文本交换时,请始终使用ISO 8601标准格式。在解析/生成字符串时,这些在java.time中默认使用。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

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

从哪里获取java.time类?

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

答案 1 :(得分:0)

MONTH中的

WEEK_OF_YEARCalendar是常量,而不是任何特定Calendar对象的月份和星期。

您可以将这些常量与get(...)方法一起使用。常量表示您想要获取的字段。像这样:

System.out.println("Calendar Month:" + temp.get(Calendar.MONTH));
System.out.println("Calendar Week:" + temp.get(Calendar.WEEK_OF_YEAR));

此外,将04-Jan-15之类的字符串解析为Date对象比手动更简单:

String text = "04-Jan-15";

DateFormat df = new SimpleDateFormat("dd-MMM-yy", Locale.US);
Date date = df.parse(text);

(为什么你首先手动解析字符串,然后将其转换为另一种格式dd/MM/yyyy,然后再解析它?这比必要的要复杂得多。)