java日期/日历 - >没有时区,没有转换

时间:2013-02-02 15:29:47

标签: java android java-ee

实际上我是一个.NET家伙,我想知道为什么处理日期/时间对象这样简单而琐碎的事情是那么复杂

我需要的是一个对象,它包含日,月,年,小时,分钟,秒......的参数... 以及操纵这些价值的可能性。

我不希望任何转换为​​任何时区。 参数值应该设置值!

问题1: 如何从分钟创建日期对象? 问题2: 如何从int?

创建日期对象

我已经花了好几个小时来完成它,我无法相信我真的必须在Java中创建自己的DateTime实现!!

我尝试使用日历(GMC,UTC ...)和日期,但始终相同。 从我的Date-TimePicker获取的值将转换为夏令时或与我定义的日历对应的其他规则。 我真正想知道的一件事是,当我只使用“日期”对象时,我的时间也会被改变...

干杯, 斯蒂芬

3 个答案:

答案 0 :(得分:2)

我想知道为什么处理日期/时间对象这样简单而琐碎的事情如此复杂

整个信息技术产业走了几十年,却没有解决日期时间处理这个棘手的难题。

Java最初继承了Taligent / IBM提供的一些代码。这些成为java.util.DateCalendarGregorianCalendar和相关类。它们是可怕的,令人毛骨悚然的,糟糕的设计,并且不是面向对象的。

由斯蒂芬·科尔本(Stephen Colebourne)领导的 Joda-Time 项目是我所知道的以健壮和称职的方式解决日期时间问题的首次尝试。后来,Colebourne等人。汲取了那里的经验教训,以指导JSR 310, java.time 实现和相关项目, ThreeTen-Backport 中的back-port以及 ThreeTen-Extra 。

因此,现在Java在 java.time 类中具有业界领先的日期时间工作框架。

对象包含日,月,年,小时,分钟,秒...的参数,并可以操纵这些值。

对于仅日期,请使用LocalDate。对于具有一天中的时间但缺少已知的自UTC或时区偏移的日期的日期,请使用LocalDateTime不是)。暂时,在时间轴上的特定点上,使用Instant(始终使用UTC),OffsetDateTime(日期在一天中,以小时数-分钟-秒为单位的日期)本初子午线之前/之后)或ZonedDateTime(指定了时区的日期和时间)。

Table of all date-time types in Java, both modern and legacy

问题1:如何从分钟创建日期对象?

不确定您的意思。

要表示未附加到时间轴的时间跨度,请使用Duration

Duration d = Duration.ofMinutes( 10 ) ;
Instant now = Instant.now() ;
Instant tenMinutesFromNow = now.plus( d ) ;

如果您要数分钟,请使用LocalTime.MINDuration(00:00:00)。

Duration d = Duration.ofMinutes( 10 ) ;
LocalTime lt = LocalTime.MIN.plus( d ) ) 

问题2:如何从int的对象创建日期对象?

我猜您的意思是您希望将年,月,日等指定为一系列数字。为此,请使用LocalDateTime工厂方法。

LocalDateTime ldt = LocalDateTime.of( 2020 , 1 , 23 , 15 , 30 , 0 , 0 ) ; // year, month, day, hour, minute, second, nanos fraction of second.

或者从LocalDateLocalTime开始构建。

LocalDate ld = LocalDate.of( 2020 , 1 , 23 ) ;
LocalTime lt = LocalTime.of( 15 , 30 ) ;
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ; 

如上所述,LocalDateTime不能代表时刻。要确定时刻,请指定一个时区。例如,在上面的代码中,您是指东京,图卢兹或托莱多的3:30 PM –您处于不同的时刻,相隔几个小时。

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

通过提取Instant来适应UTC。

Instant instant = zdt.toInstant() ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

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

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

我建议您看一下Joda Time,它的java日期设计正确。

答案 2 :(得分:0)

日期和日历不是Java库中最好的API(说得温和,我认为它们是互补的),这就是为什么许多Java程序员正在使用Joda-Time而许多人期待包含它们在JSR-310的标准发行版中,旧日期和版本的全新替代品日历混乱。 Joda还有一个额外的好处,即在Date和Joda的类型之间转换非常容易(通过使用.toDate()或使用接受Date的相关构造函数),以便在代码中使用Joda的类型,而在“外边缘”使用Date与基于日期的代码交互的地方并不痛苦。

对于你的问题2,仍然有一个接受int的Date构造函数,尽管它已被弃用,你仍然可以使用它,参见this thread。但是我只建议你采取这种方式,如果换你Joda不适合你。