如何将年和周转换为Java日期对象?

如何将年和周转换为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

如何将年和周转换为Java日期对象?我使用的是JodaTime,但使用解决方案的标准Java类也很好。

我没有使用Joda Time(虽然我听说它很好),但我认为结合使用和handy应该可以达到这个目的。例如:

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将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

请提供示例输入/数据,以确保年+周不是一天。