根据Java中的日期计数获取日期
简单的问题,但谷歌出人意料地没有这个。 我有从今年1月1 number of days
起number 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(夏令时),不同语言环境的结果可能不同。 上面的示例使用默认语言环境。
您只需使用SimpleDateFormat
将String
转换为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.Date
, java.util.Calendar
和java.text.SimpleTextFormat
现在已成为遗留问题 ,取而代之的是java.time类。
显然, Year
代表一年。 要获得当前年份,我们需要当前日期。
时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。 以同样的方式,在新年的巴黎午夜后几分钟是新的一年,而在魁北克仍然是“去年”。
以continent/region
的格式指定适当的时区名称 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写,例如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ); Year year = Year.now( z );
如果您有特定年份,请传递年份编号。
Year year = Year.of( 2017 );
Year
类包含一个atDay
方法,用于在闰年中传递从1到365或366的年份数字时生成LocalDate
。 LocalDate
类表示没有时间且没有时区的仅日期值。
LocalDate localDate = year.atDay( 159 );
走向另一个方向,您可以通过调用LocalDate::getDayOfYear
来查询LocalDate
的日期。
int dayOfYear = localDate.getDayOfYear() ;
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
- Java SE 8 , Java SE 9 , Java SE 10及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java 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的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
如果您是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();