根据Java中的日期计数获取日期

简单的问题,但谷歌出人意料地没有这个。 我有从今年1月1 number of daysnumber of days 。 如何将其转换为Java中的date

使用日历进行日期算术

  Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2013); c.set(Calendar.MONTH, Calendar.JANUARY); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); c.add(Calendar.DATE, numberOfDays); Date date = c.getTime(); 

请注意,由于DST(夏令时),不同语言环境的结果可能不同。 上面的示例使用默认语言环境。

您只需使用SimpleDateFormatString转换为Date 。 模式D可用于表示年份的日期数。

只要你有一个

 int numberOfDays = 42; // Arbitrary number. 

然后这个计算自1970年1月1日( 大纪元 )以来的天数

 Date date = new SimpleDateFormat("D").parse(String.valueOf(numberOfDays)); 

或者,这个计算自当年1月1日以来的天数。

 Date date = new SimpleDateFormat("D yyyy").parse(numberOfDays + " " + Calendar.getInstance().get(Calendar.YEAR)); 

我发现JodaTime在日期处理方面非常优雅。 有了它,你可以这样做:

 DateTime date = new DateTime().withDayOfYear(dayOfYear); 

TL;博士

 Year.of( 2017 ) .atDay( 159 ) 

2017年6月8日

……或者当年……

 Year.now( ZoneId.of( "America/Montreal" ) ) .atDay( 159 ) 

2018年6月8日

走向另一个方向,从日期到日期。

 LocalDate.now( ZoneId.of( "America/Montreal" ) .getDayOfYear() 

159

使用java.time

处理日期时间的现代方法是使用java.time类。 麻烦的旧日期时间包。 麻烦的旧日期时间类(如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在已成为遗留问题 ,取而代之的是java.time类。

显然, Year代表一年。 要获得当前年份,我们需要当前日期。

时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。 以同样的方式,在新年的巴黎午夜后几分钟是新的一年,而在魁北克仍然是“去年”。

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ); Year year = Year.now( z ); 

如果您有特定年份,请传递年份编号。

 Year year = Year.of( 2017 ); 

Year类包含一个atDay方法,用于在闰年中传递从1到365或366的年份数字时生成LocalDateLocalDate类表示没有时间且没有时区的仅日期值。

 LocalDate localDate = year.atDay( 159 ); 

走向另一个方向,您可以通过调用LocalDate::getDayOfYear来查询LocalDate的日期。

 int dayOfYear = localDate.getDayOfYear() ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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

如果您是Android开发人员并使用JodaTime,那么您将在java 8中获得相同的function。

 LocalDate.ofYearDay("2020", 255).getDayOfWeek().getValue() 

使用此,因为仅在Android> = 26之上支持YeayDay ;

 MutableDateTime mutableDateTime1 = new MutableDateTime(); mutableDateTime1.setYear("2020"); mutableDateTime1.setDayOfYear(255); LocalDate.fromDateFields(mutableDateTime1.toDate()).getDayOfWeek(); 
 Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2016); c.set(Calendar.MONTH, 8); c.set(Calendar.DAY_OF_YEAR, 244); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); Date date = c.getTime();