栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java公历返回错误的月份

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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导致了第十三星期五时,我感到不寒而栗!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号