Java公历返回错误的月份

Java公历返回错误的月份,第1张

Java公历返回错误的月份 tl; dr

要获得本月的1-12数字:

LocalDate.now()         .getMonthValue()

最好指定所需/预期的时区。

LocalDate.now(     ZoneId.of( "America/Montreal" ) ).getMonthValue()

类似地,呼叫

.getYear()
.getDayOfMonth()

细节

它返回错误的月份

就像其他人所说的,在 1月至12月

Calendar
几个月中,他们疯狂地编号为0-11,
而不是1-12。在旧的日期时间类中,许多糟糕的设计决策之一。这些类现在已被遗留,由java.time类取代。

那么有没有解决的办法?

是的,有一种解决方法。使用良好的日期时间库,而不要使用java.util.Date/Calendar的混乱信息。现代方法是使用java.time类。

当前时刻

时区对于获取当前日期和时间至关重要。对于任何给定时刻,日期和挂钟时间会因区域而异。

ZoneId z = ZoneId.of( "America/Montreal" );ZonedDateTime zdt = ZonedDateTime.now( z );

您可以查询各种组成部分,例如年,月号,通过

Month
枚举的月本地化名称和月中的某天。

System.out.println ( "Current: " + zdt );System.out.println( "Year is " + zdt.getYear() );System.out.println( "Month is " + zdt.getMonthValue() );System.out.println( "Month name is " + zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) );  // Or Locale.US, Locale.ITALY, etc.System.out.println( "Day is " + zdt.getDayOfMonth() );

当前:2016-12-14T04:54:44.802-05:00 [美国/蒙特利尔]

年份是2016

月是12

月的名字是décembre

一天是14

请参阅IdeOne.com中的实时代码。

如果您只关心日期而不是时间,请使用

LocalDate
该类。

LocalDate.now( z );
具体时刻

您可以将时刻指定为自UTC
1970年第一时刻的纪元以来的毫秒数。

long input = 1_234_567_898_765L ;Instant instant = Instant.ofEpochMilli( input );

Instant.toString():2009-02-13T23:31:38.765Z

Z
输出中的in
Zulu
表示UTC。

您可以分配时区以调整为特定的挂钟时间。

ZoneId z = ZoneId.of( "America/Montreal" );ZonedDateTime zdt = instant.atZone( z );

zdt.toString():2009-02-13T18:31:38.765-05:00 [美国/蒙特利尔]

请参阅IdeOne.com中的实时代码。

建议这样交换日期时间数据。更好地序列化为ISO
8601格式的文本。例如:

2009-02-13T23:31:38.765Z


关于java.time

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

java.util.Date
Calendar
,和
SimpleDateFormat

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

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

在哪里获取java.time类?

  • Java SE 8SE 9 及更高版本
    • 内置的
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6SE 7
    • java.time的许多功能在 ThreeTen- Backport中都被反向移植到Java 6和7 。
  • 安卓系统
    • 所述 ThreeTenABP 项目适应 ThreeTen-反向移植 (上述)为Android特异性。
    • 请参阅 如何使用…

该ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如

Interval
YearWeek
YearQuarter
,和更多。


旧答案-乔达时间

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

  • 立即使用Joda-Time 2.3。
  • 将来,使用Java 8,可以考虑迁移到JSR 310:Date and Time API,该API取代了Date / Calendar类,并且受Joda-Time的启发。
范例程式码今天
// © 2013 Basil Bourque. This source pre may be used freely forever by anyone taking full responsibility for doing so.// import org.joda.time.*;// Generally best to be explicit about time zone rather than depend on default.DateTimeZone denverTimeZone = DateTimeZone.forID( "America/Denver" );java.util.Locale locale = Locale.FRANCE;DateTime now = new DateTime( denverTimeZone );System.out.println( "Current Year, Month & Day for: " + now );System.out.println( "Year is " + now.year().getAsText( locale ) );System.out.println( "Month is " + now.monthOfYear().getAsText( locale ) );System.out.println( "Day is " + now.dayOfMonth().getAsText( locale ) );System.out.println(); // blank line.

运行时…

Current Year, Month & Day for: 2013-12-04T01:58:24.322-07:00Year is 2013Month is décembreDay is 4
有一天
// Not generally a good idea to focus on integers for working with date-time, but you asked for it.DateTime someDateTime = new DateTime( 1234567898765L, DateTimeZone.UTC );System.out.println( "Set Value of 1234567898765L is: " + someDateTime );System.out.println( "Year is " + someDateTime.year().getAsText( locale ) );System.out.println( "Month is " + someDateTime.monthOfYear().getAsText( locale ) );System.out.println( "Day of month is " + someDateTime.dayOfMonth().getAsText( locale ) );System.out.println( "Day of week is " + someDateTime.dayOfWeek().getAsText( locale ) );System.out.println( "Day of year is " + someDateTime.dayOfYear().getAsText( locale ) );

运行时…

Set Value of 1234567898765L is: 2009-02-13T23:31:38.765ZYear is 2009Month is févrierDay of month is 13Day of week is vendrediDay of year is 44

PS:当我注意到您任意选择的Long导致了第十三星期五时,我感到不寒而栗!



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5429655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存