tl;博士
使用org.threeten.extra.YearQuarter 类,以及Quarter、ZoneId、LocalDate 和Month。
YearQuarter // Represent an entire quarter of a specific year.
.now( ZoneId.of( "Asia/Tokyo" ) ) // Determine the current quarter as seen via the wall-clock time used by the people of a particular region (a time zone).
.with( // Move to another quarter.
Quarter.valueOf( "Q1" ) // Or, `Quarter.of( 1 )` if starting with an integer number rather than a `String` object.
) // Returns another `YearQuarter` object, rather than modifying the original.
.atDay( 1 ) // Returns a `LocalDate` object.
.getMonth() // Returns a `Month` enum object.
.getDisplayName( // Automatically localize the name of the month.
TextStyle.FULL , // How long or abbreviated do you want the translation.
Locale.US // Or Locale.CANADA_FRENCH and so on.
) // Returns a `String` object.
一月
YearQuarter in ThreeTen-Extra
ThreeTen-Extra 库有一个你可能会发现对这项工作有用的类:YearQuarter。
获取当前季度。我们需要一个时区来确定当前日期,从而确定当前季度。对于任何给定的时刻,日期在全球各地都因时区而异。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
YearQuarter currentYearQuarter = YearQuarter.now( z ) ;
但是您想通过解析字符串来确定四分之一。
如果你有一个样式类似于ISO 8601 的字符串(标准实际上并没有指定四分之一)YYYY-Qq 那么YearQuarter 可以directly parse。
String input = "2020-Q1" ;
YearQuarter yearQuarter = YearQuarter.parse( input ) ;
如果您只有季度部分而没有年份,请使用Quarter 枚举。如果您的输入字符串是Q1 等,请使用valueOf 检索匹配的枚举对象。
String input = "Q1" ;
Quarter quarter = Quarter.valueOf( input ) ;
如果您有一个数字而不是字符串,即1 或2 或3 或4,则使用静态方法Quarter.of。顺便说一句,在您自己的代码中,您应该传递这些 Quarter 对象而不是单纯的整数或字符串,以使您的代码更具自我记录性、提供类型安全性并确保有效值。
int input = 1 ; // Domain: 1, 2, 3, 4.
Quarter quarter = Quarter.of( input ) ;
将该Quarter 实例应用于我们当前的YearQuarter 实例以获取另一个YearQuarter 实例。这些类使用immutable objects 模式,因此我们不是在修改现有实例,而是在生成新实例。
YearQuarter yearQuarter = currentYearQuarter.with( quarter ) ;
yearQuarter.toString(): 2019-Q1
从该年季度获取第一个日期 (LocalDate)、年月 (YearMonth) 和 Month 枚举对象。
LocalDate firstDate = yearQuarter.atDay( 1 ) ;
YearMonth yearMonth1 = YearMonth.from( firstDate ) ;
YearMonth yearMonth2 = yearMonth1.plusMonths( 1 ) ;
YearMonth yearMonth3 = yearMonth1.plusMonths( 2 ) ;
生成一个包含 automatically localized 月份名称的字符串。
Locale locale = Locale.US ; // Or Locale.CANADA_FRENCH and so on.
String output1 = yearMonth1.getMonth().getDisplayName( TextStyle.FULL , locale ) ;
一月
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。