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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从字符串日期获取包含月份名称的周数相关的知识,希望对你有一定的参考价值。

我有一个包含表单中日期的字符串

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();
    }

这回来了

日期:2015年1月4日00:00:00 EET 2015

日历月:2

日历周:3

我试过(早些时候)这个

temp.set(year, month, day);

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

任何的想法?

答案

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然后再解析它?这比必要的要复杂得多)。

另一答案

tl;dr

对于文化定义的周......

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

Week number

周数是文化定义的。要访问一周中的某一年,您必须指定一个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中默认使用。


About java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

以上是关于从字符串日期获取包含月份名称的周数的主要内容,如果未能解决你的问题,请参考以下文章

从年中的周数获取日期范围

从 T-SQL 中的周数获取日期

从T-SQL中的周数中获取日期

从SQL Server中的周数获取周开始日期和周结束日期

如何计算编号。从当前周到给定周的周数?

Java中常用日期操作及方法