简而言之
MonthDay.from(
LocalDate.now( ZoneId.of( "America/Montreal" ) )
).format( DateTimeFormatter.ofPattern( "MM/dd" ) )
01/24
月日
有一个专门的类:MonthDay
。
MonthDay
表示月份和日期的组合。
MonthDay md = MonthDay.of( Month.JANUARY , 24 );
避免使用过时的日期时间类。
避免使用麻烦的旧日期时间类,如 SimpleDateFormat
,现在已过时,并被 java.time 类取代。
MonthDay
类是内置于 Java 8 及更高版本的 java.time 框架的一部分。大部分 java.time 功能可以回溯到 Java 6 和 Java 7(详见下文)。
ISO 8601
md.toString(): --01-24
toString
方法生成符合标准 ISO 8601 格式的字符串。MonthDay
类也可以解析这种字符串。
当前日期
您想要获取当前日期的月份和日期。对于当前日期,我们将使用 LocalDate
类。LocalDate
类表示仅包含日期而不包含时间和时区的值。
时区
时区对于确定日期至关重要。对于任何给定的时刻,日期会因时区而在全球范围内变化。例如,在
巴黎法国午夜过后几分钟是新的一天,但在
蒙特利尔魁北克仍然是“昨天”。
请使用
continent/region
格式指定一个
正确的时区名称,例如
America/Montreal
、
Africa/Casablanca
或
Pacific/Auckland
。不要使用3-4个字母的缩写,例如
EST
或
IST
,因为它们不是真正的标准化的时区,也不是唯一的!
请明确,
Locale
与时区
没有任何关系。
Locale
仅适用于生成字符串时的文本格式,但与时区是分开且独立的。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
现在提取一个MonthDay
对象。
MonthDay md = MonthDay.from( today );
today.toString(): 2017-01-25
md.toString(): --01-25
其他格式
您可以生成其他格式的字符串。
java.time类可以通过Locale
自动本地化一些日期时间值。不幸的是,这不适用于MonthDay
。对于MonthDay
,当您需要除标准ISO 8601格式之外的内容时,必须在DateTimeFormatter
对象中明确指定所需的格式。顺便说一句,我鼓励您尽可能使用标准格式,特别是用于交换数据。您甚至可以考虑培训用户接受此格式。标准格式是明确无歧义的,而您的英美格式(dd/MM、MM/dd)可能完全模棱两可,例如01/02既可以是1月2日也可以是2月1日。
使用Locale
来确定(a)名称翻译的人类语言,例如星期几、月份等,以及(b)决定缩写、大写、标点符号等方面的文化规范。通常,我建议始终为您的DateTimeFormatter
指定一个Locale
,而不是隐式地依赖于JVM的当前默认Locale
。但是我没有看到Locale
如何影响此特定格式的输出方式。因此,在此示例中省略了Locale
。
DateTimeFormatter fUS = DateTimeFormatter.ofPattern( "MM/dd" );
DateTimeFormatter fUK = DateTimeFormatter.ofPattern( "dd/MM" );
String output = md.format( fUS );
实时代码
查看此示例 在IdeOne.com上实时运行的代码。
关于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
和 更多。
sdfus
的倒数第三行写到SimpleDateFormat sdfus = new SimpleDateFormat("dd/MM", Locale.US);
-- 你是不是想说应该用MM/dd
而不是dd/MM
? - leeyuiwahgetDateInstance()
方法需要一个style
参数。最短的样式似乎是DateFormat.SHORT
。你可以争论,也许他们应该提供一个更短的(比如DateFormat.SHORTER
?)参考网址:http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html#getDateInstance(int) - leeyuiwah