如何将年份和周度转换为Java Date对象?我正在使用JodaTime,但使用解决方案的标准Java类也很好。
答案 0 :(得分:7)
使用标准java类的解决方案。这只是获取当前时间并将年份和星期的字段设置为已知值。
Calendar cld = Calendar.getInstance();
cld.set(Calendar.YEAR, year);
cld.set(Calendar.WEEK_OF_YEAR, week);
Date result = cld.getTime();
答案 1 :(得分:1)
我没有使用Joda-Time(虽然我听说它很棒),但我认为DateTime
constructor和方便plusWeeks
method的组合应该可以解决问题。 E.g:
DateTime dt = new DateTime(theYear, 1, 1, 0, 0, 0, 0).plusWeeks(theWeeks);
...自Joda-Time apparently uses以1为基础的月份和日期,以及从零开始的时间。
答案 2 :(得分:1)
您可以使用已弃用的java.util.Date(int,int,int,int,int,int)
构造函数,例如new Date(2011,2,12,10,13,13);
或
使用java.util.Calendar
并使用其set(int,int)
方法(例如c.set(Calendar.DAY_OF_MONTH,22);
将日期设置为22)您可以使用Calendar.getTime()
将当前日历时间恢复为{{1 }}。日期构造函数和日历之间的区别在于,只有日历能够为UTC创建不同时区的日期(这也是不推荐使用日期构造函数的原因)。
答案 3 :(得分:1)
compile 'com.android.support:recyclerview-v7:23.2.1'
2016年1月4日
严格来说,您不能从一年和一周的数字中获取日期。但我会继续假设您打算在任何特定年份获得本周的第一天。周数。
现代方法是使用java.time类来取代麻烦的旧遗留日期时间类。
WeekFields
课程为您提供了与周年合作的方法。
YearWeek.of( 2016 , 1 )
.atDay( DayOfWeek.MONDAY )
定义了几周每周的定义很多。此示例代码使用JVM的当前默认值Locale
来确定定义。
Locale
请注意,在这个周的定义中,年初(2016年)的一周的第一天实际上是接近上一年(2015年)结束的那一天。
2015年12月27日
您的公司可能会选择采用标准ISO 8601周。在这个简单的方案中,第#周号包含日历年的第一个星期四,而星期一是星期一到星期日。一年有52或53周。
与上面相同的代码,但是我们使用常量ISO定义的WeekFields.ISO
来切换依赖于Locale的int year = 2016;
int week = 1;
int dayOfWeek = 1; // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.of ( Locale.CANADA_FRENCH );
LocalDate ld = LocalDate.now ( )
.withYear ( year )
.with ( weekFields.weekOfYear ( ), week )
.with ( weekFields.dayOfWeek ( ), 1 );
System.out.println ( "ld: " + ld );
对象。但是我们得到了一个非常不同的结果,WeekFields
而不是2016-01-04
。
2015-12-27
2016年1月4日
int year = 2016;
int week = 1;
int dayOfWeek = 1; // 1-7, locale-dependent such as Sunday-Monday in US.
WeekFields weekFields = WeekFields.ISO;
LocalDate ld = LocalDate.now ( )
.withYear ( year )
.with ( weekFields.weekOfYear ( ), week )
.with ( weekFields.dayOfWeek ( ), 1 );
System.out.println ( "ld: " + ld );
如果您将ThreeTen-Extra库添加到项目中,这项工作会更容易。您可以将YearWeek
课程用于标准ISO 8601周。
请勿将日历年编号与基于周的年份编号混淆。
YearWeek
YearWeek yw = YearWeek.of( 2016 , 1 ); // Passing a week-based-year number, *NOT* a calendar year.
方法生成toString
标准ISO 8601格式的字符串,例如yyyy-Www
。
要获取特定日期,请使用Java的DayOfWeek
枚举对象指定星期几。
2016-W01
您可以询问以周为基础的年份是52周还是53周。
LocalDate ld = yw.atDay( DayOfWeek.MONDAY );
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。
答案 4 :(得分:0)
这段非常难看的代码与org.joda.time.DateTime一起为我工作。方法plusWeeks没有工作,因为它没有将日期移动到一周的开始。如果您将周数添加到星期四,那么结果日期也是星期四。
DateTime startOfTheWeek = new DateTime().withYear(2016).withWeekOfWeekyear(52)
.withDayOfWeek(1).withTimeAtStartOfDay();
DateTime endOfTheWeek = startOfTheWeek.withDayOfWeek(7).withTime(23,59,59,999);
System.out.println("Start date: " + startOfTheWeek.toDate());
System.out.println("End date: " + endOfTheWeek.toDate());
这打印出如下内容:
Start date: Mon Dec 26 00:00:00 EET 2016
End date: Sun Jan 01 23:59:59 EET 2017