如何将年和周转换为Java日期对象?
如何将年和周转换为Java日期对象?我使用的是JodaTime,但使用解决方案的标准Java类也很好。我没有使用Joda Time(虽然我听说它很好),但我认为结合使用和handy应该可以达到这个目的。例如:如何将年和周转换为Java日期对象?,java,datetime,Java,Datetime,如何将年和周转换为Java日期对象?我使用的是JodaTime,但使用解决方案的标准Java类也很好。我没有使用Joda Time(虽然我听说它很好),但我认为结合使用和handy应该可以达到这个目的。例如: DateTime dt = new DateTime(theYear, 1, 1, 0, 0, 0, 0).plusWeeks(theWeeks); …从Joda开始,时间为1个月和天,时间为零。使用标准java类的解决方案。这只是获取当前时间,并将年和周字段设置为已知值 Calenda
DateTime dt = new DateTime(theYear, 1, 1, 0, 0, 0, 0).plusWeeks(theWeeks);
…从Joda开始,时间为1个月和天,时间为零。使用标准java类的解决方案。这只是获取当前时间,并将年和周字段设置为已知值
Calendar cld = Calendar.getInstance();
cld.set(Calendar.YEAR, year);
cld.set(Calendar.WEEK_OF_YEAR, week);
Date result = cld.getTime();
您可以使用不推荐使用的
java.util.Date(int,int,int,int,int,int)
constructor,例如newdate(2011,2,12,10,13,13)代码>或
使用java.util.Calendar
并使用其set(int,int)
方法(例如c.set(Calendar.DAY/u/u/MONTH,22);
将日期设置为22)可以使用Calendar.getTime()
将当前日历时间恢复为java.util.Date
。日期构造函数和日历之间的区别在于,只有日历能够为UTC以外的不同时区创建日期(这也是不推荐使用日期构造函数的原因) 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
tl;博士
2016-01-04
年周不是日期
严格地说,你不能从一年和一周的数字中得到一个日期。但我将继续假设您打算获得任何给定年份和周数的每周第一天
使用java.time
现代的方法是使用java.time类来取代麻烦的旧遗留日期时间类
这门课让你在一年中的一周里工作
Locale
defined weeks
一年中的一周有很多定义。此示例代码使用JVM的当前默认语言环境
来确定定义
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 );
请注意,在周的定义中,年初(2016年)一周的第一天实际上是上一年(2015年)末的一天
2015-12-27
ISO 8601标准周
您的企业可以选择采用标准周。在这个简单的方案中,周数#1包含日历年的第一个星期四,周运行周一周日。一年有52或53周
int weeksInWeekBasedYear = yw.lengthOfYear();
与上面的代码相同,但我们使用常量ISO定义的对象切换出依赖于语言环境的WeekFields
对象。但是我们得到了一个非常不同的结果,2016-01-04
而不是2015-12-27
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 );
2016-01-04
YearWeek
如果将Three Ten额外库添加到项目中,这项工作会更容易。您可以将该类用于标准ISO 8601周
不要将日历年编号与基于周的年份编号混淆
YearWeek yw = YearWeek.of( 2016 , 1 ); // Passing a week-based-year number, *NOT* a calendar year.
toString
方法生成标准ISO 8601格式的yyyy Www
字符串,如2016-W01
要获取特定日期,请使用Java的枚举对象指定星期几
LocalDate ld = yw.atDay( DayOfWeek.MONDAY );
您可以询问基于周的年份是52周还是53周
int weeksInWeekBasedYear = yw.lengthOfYear();
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。请提供示例输入/数据,以确保年+周不是一天。