从字符串日期获取包含月份名称的周数
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_YEAR
和Calendar
是常数,而不是任何特定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.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
从哪里获取java.time类?
- Java SE 8,Java SE 9,以及之后 内置。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小功能和修复。
- Java SE 6和Java SE 7 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
- Android ThreeTenABP项目特别适用于android的ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
以上是关于从字符串日期获取包含月份名称的周数的主要内容,如果未能解决你的问题,请参考以下文章