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

时间:2011-04-21 06:48:38

标签: java datetime

如何将年份和周度转换为Java Date对象?我正在使用JodaTime,但使用解决方案的标准Java类也很好。

5 个答案:

答案 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)

TL;博士

compile 'com.android.support:recyclerview-v7:23.2.1'
  

2016年1月4日

年 - 周不是日期

严格来说,您不能从一年和一周的数字中获取日期。但我会继续假设您打算在任何特定年份获得本周的第一天。周数。

使用java.time

现代方法是使用java.time类来取代麻烦的旧遗留日期时间类。

WeekFields课程为您提供了与周年合作的方法。

YearWeek.of( 2016 , 1 ) .atDay( DayOfWeek.MONDAY ) 定义了几周

每周的定义很多。此示例代码使用JVM的当前默认值Locale来确定定义。

Locale

请注意,在这个周的定义中,年初(2016年)的一周的第一天实际上是接近上一年(2015年)结束的那一天。

  

2015年12月27日

ISO 8601标准周

您的公司可能会选择采用标准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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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