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

java日期/日历->;没有时区,没有转换,java,android,jakarta-ee,Java,Android,Jakarta Ee,事实上,我是一个.NET的人,我想知道为什么像处理日期/时间对象这样简单而琐碎的事情会如此复杂 我所需要的一切都是一个对象,它包含日、月、年、小时、分钟、秒的参数。。。 以及操纵这些价值观的可能性 我不想转换成任何时区。 参数的值应具有设置的值 问题1: 如何从分钟创建日期对象? 问题2: 如何从int创建日期对象 我已经花了几个小时来完成这项工作,我不敢相信我真的必须用Java创建自己的DateTime实现 我尝试使用日历(GMC、UTC…)和日期,但总是一样的。 从日期时间选择器获取的值将转

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

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

我不想转换成任何时区。 参数的值应具有设置的值

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

我已经花了几个小时来完成这项工作,我不敢相信我真的必须用Java创建自己的DateTime实现

我尝试使用日历(GMC、UTC…)和日期,但总是一样的。 从日期时间选择器获取的值将转换为夏令时或与我定义的日历相对应的其他规则。 我真正想知道的一件事是,当我只使用“日期”对象时,我的时间也会发生变化

干杯,
斯特凡

< P>我建议你看看JoDA时间,java的日期设计正确。

< P>我建议你看看JoDA时间,java的日期设计正确。

< P>日期和日历不是java库中最好的API(要温和地说,我认为它们是缺陷互补)。这就是为什么很多Java程序员都在使用,而且很多人都期待着在标准发行版中加入,一个全新的日期和日历替代品。Joda还有一个额外的好处,即在Date和Joda的类型之间进行转换非常容易(通过使用.toDate()或使用接受日期的相关构造函数),因此在代码内部使用Joda的类型,并在与基于日期的代码交互的“外边缘”使用Date,一点也不痛苦


对于您的问题2,仍然有一个接受int的日期构造函数,尽管它已被弃用,但您仍然可以使用它,请参阅。但是我建议你选择这个路线,如果切换到Joda不是你的选择。

< P>日期和日历不是java库中最好的API(简单地说,我认为它们是缺陷互补的),这就是为什么很多java程序员在使用,并且许多人都希望包含在标准分布中,旧日期和日历混乱的全新替代品。Joda还有一个额外的好处,即在Date和Joda的类型之间进行转换非常容易(通过使用.toDate()或使用接受日期的相关构造函数),因此在代码内部使用Joda的类型,并在与基于日期的代码交互的“外边缘”使用Date,一点也不痛苦

对于您的问题2,仍然有一个接受int的日期构造函数,尽管它已被弃用,但您仍然可以使用它,请参阅。但我只建议你在不选择乔达的情况下选择这条路线

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

作为一个整体,信息技术行业几十年来都没有解决数据时间处理这一令人惊讶的棘手问题

Java最初继承了Taligent/IBM提供的一些代码。它们成为
java.util.Date
Calendar
GregoriaCalendar
,以及相关的类。它们糟糕透顶,设计上有缺陷,而且不是面向对象的

Stephen Colebourne领导的Joda时间项目是我所知的第一次尝试,以一种稳健和胜任的方式解决日期时间问题。后来,Colebourne等人从中吸取了经验教训,领导了JSR 310、java.time实现和相关项目、Three Ten Backport中的back port以及Three Ten Extra中的进一步附加功能

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

对象,该对象保存日、月、年、小时、分钟、秒的参数。。。以及操纵这些价值观的可能性

仅限日期,请使用
LocalDate
。对于包含一天中某个时间但缺少UTC或时区已知偏移量上下文的日期,请使用
LocalDateTime
(不是片刻)。对于时间线上的某个特定点,使用
Instant
(始终以UTC为单位)、
OffsetDateTime
(在本初子午线前/后一定数小时分秒的背景下的日期)或
zoneDateTime
(指定时区的日期和时间)

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

不知道你的意思

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

Duration d = Duration.ofMinutes( 10 ) ;
Instant now = Instant.now() ;
Instant tenMinutesFromNow = now.plus( d ) ;
如果您有一天的分钟数,请使用
LocalTime.MIN
(00:00:00)和
持续时间

Duration d = Duration.ofMinutes( 10 ) ;
LocalTime lt = LocalTime.MIN.plus( d ) ) 
问题2:如何从int创建日期对象

我猜你的意思是你想把年、月、日等指定为一系列数字。为此,请使用
LocalDateTime
factory方法

LocalDateTime ldt = LocalDateTime.of( 2020 , 1 , 23 , 15 , 30 , 0 , 0 ) ; // year, month, day, hour, minute, second, nanos fraction of second.
或者从
LocalDate
LocalTime
构建

LocalDate ld = LocalDate.of( 2020 , 1 , 23 ) ;
LocalTime lt = LocalTime.of( 15 , 30 ) ;
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ; 
如上所述,
LocalDateTime
不能表示一个时刻。要确定某个时刻,请指定时区。例如,在我们上面的代码中,你是指东京、图卢兹还是托莱多的下午3:30——不同的时刻,相隔几个小时

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
通过提取一个
瞬间
,调整为UTC

Instant instant = zdt.toInstant() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

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

从哪里获得java.time类