我有一个字符串,其中包含
形式的日期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);
并且仍然得到错误的结果。
有什么想法吗?
答案 0 :(得分:1)
文化定义的周...
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类取代。现在解决你的问题要简单得多。
解析输入字符串。指定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标准格式。在解析/生成字符串时,这些在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类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
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
,然后再解析它?这比必要的要复杂得多。)