当前位置:  开发笔记 > 编程语言 > 正文

Java"周年"如何真正起作用?

如何解决《Java"周年"如何真正起作用?》经验,为你挑选了2个好方法。



1> Thomas Kläge..:

这很简单:2015年12月27日是2016年第1周第1天(2026年12月27日是2027年第1周第1天).这可以通过添加以下行来验证:

SimpleDateFormat odf = new SimpleDateFormat("YYYY-ww-u");
System.out.println(odf.format(d1));
System.out.println(odf.format(d2));
System.out.println(odf.format(d3));

如果SimpleDateFormat输出日期,则可以使用所有字段:年,月,日,星期几,星期几,星期,星期等.

在解析时,SimpleDateFormat需要一组匹配的值:日,月,年星期几,星期,星期和星期.由于您提供的是一周,但没有提供一周中的一周和一周中的一周,因此将这些值假设为1.


实际值取决于您的区域设置:

哪一周是第1周

哪一天是一周的第一天

(参见https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#week_and_year)

在我的系统上(使用de-ch语言环境,以"EEE MMM dd HH:mm:ss zzz yyyy - YYYY-ww-u"作为格式)我得到

Mo Jan 04 00:00:00 MEZ 2016 - 2016-01-1
Mo Jan 04 00:00:00 MEZ 2016 - 2016-01-1
Mo Jan 04 00:00:00 MEZ 2027 - 2027-01-1



2> Basil Bourqu..:
定义各不相同

可以用不同的方式定义一周。例如,在美国,一周的第一天通常被认为是星期日,而在欧洲和许多其他地方,第一天是星期一。

同样,也可以以不同的方式定义基于一周的一年中的一周。

第1周包含1月1日。

第一周是包含特定星期几(例如星期日)的第一周。

第1周是仅包含新年的第一周,没有上一年的日期。

… 和更多

您正在使用的旧类隐式使用所指定的定义LocaleLocale如果未另行指定,则使用JVM的当前缺省值,所应用的语言环境也是隐式的。

有关难以定义星期的更多有趣的详细信息,请参阅此问题,JVM 8和JVM 10上WeekFields的不同行为

ISO 8601

对于日期时间处理,有一个实用的国际标准ISO 8601

一周的ISO 8601定义是:

每周从星期一开始

第一周是一年中的第一个星期四

一年包括52或53周。

一年可能与上一个日历年以及下一个日历年相距一或多个天。

我建议尽可能使用ISO 8601标准定义。该标准定义既简单又合乎逻辑,并且在整个行业中得到越来越多的采用。

java.time

java.time类提供的基于周的星期一定的支持WeekFields类。

LocalDate ld = LocalDate.of( 2019 , Month.JANUARY , 1 ) ;
long week = ld.get( WeekFields.ISO.weekOfWeekBasedYear() ) ;

参见IdeOne.com实时运行此代码。

ld.toString():2019-01-01

周:1

org.threeten.extra.YearWeek

但是,如果要做很多工作,我建议将ThreeTen-Extra库添加到您的项目中。您会发现该YearWeek课程对您有所帮助。此类提供了几种便捷的方法,例如LocalDate在该周的任何一天生成一个。

LocalDate ld = LocalDate.of ( 2019 , Month.JANUARY , 1 );
YearWeek yw = YearWeek.from ( ld );
LocalDate startOfWeek = yw.atDay ( DayOfWeek.MONDAY );

ld.toString():2019-01-01

yw.toString():2019-W01

startOfWeek.toString():2018-12-31

请注意,以周为基础的2019年中的一年的第一天如何是上一个日历年2018年而不是2019年的日期。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。

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

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

在哪里获取java.time类?

Java SE 8 Java SE 9 Java SE 10 Java SE 11和更高版本-标准Java API的一部分,具有捆绑的实现。

Java 9添加了一些次要功能和修复。

Java SE 6 Java SE 7

大多数java.time功能都在ThreeTen- Backport中反向移植到Java 6和7 。

安卓系统

更高版本的Android捆绑了java.time类的实现。

对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参阅如何使用ThreeTenABP…

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有