简而言之
YearMonth.parse(
"07/2014" ,
DateTimeFormatter.ofPattern( "MM/uuuu" )
).isAfter(
YearMonth.now(
ZoneId.of( "Africa/Tunis" )
)
)
java.time
现代解决方案使用
java.time类而不是麻烦的旧日期时间类。
年份和月份仅需使用
YearMonth
类来表示整个月。
String input = "07/2014" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = YearMonth.parse( input , f ) ;
提示:在整个代码库中使用这样的YearMonth对象而不是仅仅使用一个字符串。当您需要一个字符串来交换数据时,请使用标准的
ISO 8601格式:
YYYY-MM
。Java.time类在解析/生成字符串时默认使用标准格式,因此无需定义格式模式。
当前年月
确定当前年月意味着确定当前日期。
时区对于确定日期至关重要。对于任何给定的时刻,日期会因时区而在全球范围内变化。例如,在
法国巴黎午夜后几分钟是新的一天,而在
加拿大魁北克省蒙特利尔仍然是“昨天”。
如果没有指定时区,则JVM隐式地应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将您期望的时区明确指定为参数。
请使用格式为continent/region
的正确时区名称,例如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的!
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果您想使用JVM的当前默认时区,请请求并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好明确说明,因为默认值可能在运行时的任何线程中的任何应用程序的任何代码中随时更改。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
同样的想法适用于获取当前的YearMonth
:传递一个ZoneId
。
YearMonth currentYearMonth = YearMonth.now( z ) ;
对比
使用方法 isBefore
, isAfter
, 和 equals
进行对比。
boolean isAfterCurrentYearMonth = ym.isAfter( currentYearMonth ) ;
关于 java.time
java.time 框架内置于 Java 8 及更高版本。这些类替代了旧的麻烦 遗留 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time项目目前处于维护模式,建议迁移到java.time类。
想了解更多信息,请参见Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
如何获取java.time类?
ThreeTen-Extra项目通过添加额外的类来扩展java.time。该项目是java.time可能未来添加的潜在场所。您可能会在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和更多。
java.util.Date
,java.util.Calendar
和java.text.SimpleDateFormat
等老旧的日期时间类现已成为遗留系统,被Java 8和Java 9内置的java.time
类所取代。请参见Oracle的教程。提示:使用YearMonth
类。 - Basil Bourque