java检查日期实例是否有时间部分

java检查日期实例是否有时间部分,java,date,datetime,Java,Date,Datetime,我的类中有一个Date字段,它可以有两种类型的值:有时间和没有时间。类似这样:2015-01-01和2015-01-01 12:00:00。我想从我的日期生成格式化字符串。我知道我可以使用SimpleDateFormat类来完成此操作,但我不知道其格式。事实上,如果我的日期有时间部分,我必须使用yyy-MM-dd HH:MM:ss格式,如果我的日期没有时间部分,我必须使用yyy-MM-dd格式。我的问题是,在格式化日期和时间段之前,是否需要检查日期和时间段? 这是我的密码: private Si

我的类中有一个
Date
字段,它可以有两种类型的值:有时间和没有时间。类似这样:
2015-01-01
2015-01-01 12:00:00
。我想从我的日期生成格式化字符串。我知道我可以使用
SimpleDateFormat
类来完成此操作,但我不知道其格式。事实上,如果我的日期有时间部分,我必须使用
yyy-MM-dd HH:MM:ss
格式,如果我的日期没有时间部分,我必须使用
yyy-MM-dd
格式。我的问题是,在格式化日期和时间段之前,是否需要检查日期和时间段?

这是我的密码:

private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);

.....

private String formatDate(Date date){
     //I need to something like this:
     if(/* `date` has time part */){
          return dateTimeFormat.format(date);
     }

     else{
          return dateFormat.format(date);
     }
}

假设您使用的是从java.util.Date派生的java.sql.Date,则日期对象不可能没有时间值。 请注意文件:
日期对象实例持有一个毫秒值,精确地说是当前时间和1970年1月1日午夜UTC之间的差值(以毫秒为单位)。

假设您使用的是从java.util.Date派生的java.sql.Date,则日期对象不可能没有时间值。 请注意文件:
日期对象实例持有一个毫秒值,精确地说是当前时间与1970年UTC 1月1日午夜之间的差值(以毫秒为单位)。

您无法可靠地做到这一点,因为一旦创建了
日期
对象,它将以毫秒为单位表示,其中包括特定时间。因此,您不可能知道对象是如何构建的,以及是否设置了特定时间


解决方法是检查小时、分钟和秒是否设置为零。请记住,日期很可能被解析为
“yyyy-MM-dd HH:MM:ss”
,但所有这些值都被设置为
0
,因为时间确实是
00:00
。但是,这个概率等于
1/(24*60*60)=0.00001157407
,所以我假设你可以接受这个概率。

你不能可靠地做到这一点,因为一旦你创建了
Date
对象,它就以毫秒为单位表示,包括特定的时间。因此,您不可能知道对象是如何构建的,以及是否设置了特定时间


解决方法是检查小时、分钟和秒是否设置为零。请记住,日期很可能被解析为
“yyyy-MM-dd HH:MM:ss”
,但所有这些值都被设置为
0
,因为时间确实是
00:00
。但是,这个概率等于
1/(24*60*60)=0.00001157407
,因此我假设您可以接受这个概率。

使用
日历
对象。日历可以让您结构化地访问
日期
值的所有字段,即年、月、日、小时、分钟、秒等。这将允许您检查时间字段是否为非零。正如JB Nizet所述,时间部分可能恰好为零,在这种情况下,我们会将其误解为仅限日期的值。

使用
日历
对象。日历可以让您结构化地访问
日期
值的所有字段,即年、月、日、小时、分钟、秒等。这将允许您检查时间字段是否为非零。正如JB Nizet所说,时间部分可能恰好为零,在这种情况下,我们会将其误解为仅限日期的值。

如其他答案所示,与Java捆绑在一起的旧日期时间类,如Java.util.date和Java.sql.date,是一团混乱。由于设计决策失误,它们被匆忙推向市场。具体来说,java.util.Date表示日期和时间,而其子类java.sql.Date假装没有时间,但实际上有时间。文档解释说你应该忽略这个继承关系来帮助维持这种错觉。不太好

java.time 这种混乱局面已经被内置在Java8和更高版本中的框架所取代。新类的灵感来源于一个非常成功的框架,该框架旨在作为其继承者,在概念上类似,但经过了重新设计。定义为。由项目扩展。看

仅日期 在新的班级中有一个是。这是与Java捆绑在一起的第一个类,用于仅表示日期,而不表示一天中的时间或时区。要确定诸如“今天”之类的日期,您需要时区(a)。例如,巴黎新的一天比蒙特勒尔早。当您只需要日期值时,我建议您在您的类中添加此类型的成员

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
日期时间 如果你想要一个约会时间,先考虑一下上课时间。这标志着UTC时间线上的一个时刻。几乎总是最好在UTC中执行业务逻辑和数据存储当您需要一个特定的时间点而不是一个模糊的日期时,请将此类成员添加到您的班级中

Instant now = Instant.now();
要在用户所需/预期的时区向用户演示,请将时区应用于某个瞬间以获得一个时间

一天中的第一刻 我不推荐这种策略,但直接回答您关于检测日期时间值中的时间是否恰好是一天中的第一个时刻的问题

首先,你需要考虑时区。上面提到的所有这些日期时间类都通过UTC中的计数来跟踪时间。旧类以毫秒计,新类以纳秒计。新旧时代都是UTC 1970年的第一个时刻。因此,正如你在问题中提出的那样,没有没有时间的日期时间。最接近这一点的是一个日期时间,它的时间恰好是一天中的第一个时刻。似乎是你的情况(尽管我上面的讨论强烈建议你改变你的情况)

如何确定日期时间是否具有一天中的第一个时刻?首先,你必须考虑时区。要么您想要UTC,要么您想要一个
ZonedDateTime zdt = ZonedDateTime.ofInstant( now , ZoneId.of( "America/Montreal" ) );
Instant instant = myJUDate.toInstant();
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
// Convert to LocalDate, to get start of day, to compare to above.
LocalDate localDate = zdt.toLocalDate ();
ZonedDateTime startOfDay = localDate.atStartOfDay ( zoneId );
Boolean isStartOfDay = ( zdt.isEqual ( startOfDay ) );
System.out.println ( "instant: " + instant + " for zoneId: " + zoneId + " is zdt: " + zdt + " if compared to startOfDay: " + startOfDay + " is T/F: " + isStartOfDay );