【问题标题】:Java: What is the idiomatic way to extract month and year from Date [duplicate]Java:从日期中提取月份和年份的惯用方法是什么[重复]
【发布时间】:2014-02-20 21:46:12
【问题描述】:

假设我有一个 java.util.Date 对象的实例。

Date date = new Date();

提取年份和月份的惯用方法是什么?似乎 getMonth 和 getYear 方法已被弃用。我应该改用什么?

【问题讨论】:

  • 好像是这样,谢谢提醒。
  • javadoc 解释了为什么它们已被弃用,并告诉您应该改用什么。阅读它。
  • 哇,-2,触摸人群。我做到了,我只是没有立即找到解释。 getMonth @Deprecated public int getMonth() Deprecated. As of JDK version 1.1, replaced by Calendar.get(Calendar.MONTH). Returns a number representing the month that contains or begins with the instant in time represented by this Date object. The value returned is between 0 and 11, with the value 0 representing January. Returns: the month represented by this date. See Also: Calendar 这应该更像calendarInstance.get(Calendar.MONTH)

标签: java


【解决方案1】:

Java 中的日期 API 确实过于复杂。你应该使用

 Calendar c = Calendar.getInstance();
 c.setTime(date);
 c.get(Calendar.MONTH);
 c.get(Calendar.YEAR);

【讨论】:

  • 感谢 Joao,这正是我在文档中缺少的 sn-p。
  • 实际上,日期 日历都过于复杂。在 Java 8 中使用 Joda-Time 或 java.time.*。
  • 事实证明,这足以满足我的需求,因为我只是在处理以前生成的日期并在没有附加时区数据的情况下保存到数据库中。对于所有需要时区感知或一致行为的事情,我肯定会使用 joda,或者升级到 java 8。
【解决方案2】:

Java 捆绑的 java.util.Date 和 Calendar 类是出了名的麻烦。避开他们。

问题和其他答案都忽略了时区的关键问题。如果您忽略指定时区,您将获得 JVM 的默认值。这意味着当在不同的计算机上运行或更改 JVM 设置时,您的代码的结果会有所不同,这可能不是您想要的。

乔达时间

这个第三方开源库Joda-Time 是一个流行的替代品。

指定时区而不是依赖默认值。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
java.util.Locale locale = java.util.Locale.FRANCE;

DateTime now = new DateTime( timeZone );
int dayOfMonth = now.getDayOfMonth(); 
int monthOfYear = now.getMonthOfYear();  // 1-based counting, January = 1, unlike java.util.Calendar.
String nowAsString = DateTimeFormat.forStyle( "F-" ).withLocale( locale ).print( now );

转储到控制台...

System.out.println( "now: " + now );
System.out.println( "dayOfMonth: " + dayOfMonth );
System.out.println( "monthOfYear: " + monthOfYear );
System.out.println( "nowAsString: " + nowAsString );

运行时……

now: 2014-02-21T05:51:18.688+01:00
dayOfMonth: 21
monthOfYear: 2
nowAsString: vendredi 21 février 2014

java.time.*

Java 8 带来了一个新的java.time.8 package 来取代旧的 j.u.Date/Calendar 类。这个新包的灵感来自 Joda-Time(但经过重新架构)并由 JSR 310 定义。

ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

int dayOfMonth = now.getDayOfMonth();
int monthOfYear = now.getMonthValue();  // 1-based counting, January = 1, unlike java.util.Calendar.
String nowAsString = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( Locale.FRANCE ).format( now );

转储到控制台...

System.out.println( "now: " + now );
System.out.println( "dayOfMonth: " + dayOfMonth );
System.out.println( "monthOfYear: " + monthOfYear );
System.out.println( "nowAsString: " + nowAsString );

运行时……

now: 2014-02-21T06:05:48.833+01:00[Europe/Paris]
dayOfMonth: 21
monthOfYear: 2
nowAsString: vendredi 21 février 2014

【讨论】:

  • Basil,很好的答案,谢谢你把它放在一起。我熟悉 joda 时间和时区的使用。我以为我没有 joda 时间作为我正在从事的项目的第三方库的一部分,但事实证明我是作为 gapi 依赖项的一部分。干杯
猜你喜欢
  • 2016-02-10
  • 2021-11-04
  • 2021-10-02
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多