如何从java.util.Date获取日期部分(处理时间部分)?

时间:2011-09-30 11:18:15

标签: java date calendar date-comparison

我想比较两个java.util.Date对象的日期部分。我怎样才能做到这一点?我不打算分别比较日期,月份和年份。

提前致谢!

5 个答案:

答案 0 :(得分:4)

commons-lang DateUtils为这个问题提供了一个很好的解决方案:

watch this

通过这种方式,您可以在一行中比较两个Date个实例,而无法看到所需Date的每个部分。

Date date1 = new Date(2011, 8, 30, 13, 42, 15);
    Date date2 = new Date(2011, 8, 30, 15, 23, 46);
    int compareTo = DateUtils.truncatedCompareTo(date1, date2,
            Calendar.DAY_OF_MONTH);

在此示例中,compareTo的值为0。

答案 1 :(得分:3)

Date只是一个瞬间。当您将日历和时区应用于日期时,它实际上只是“意味着”任何日期。因此,您应该真正关注Calendar,如果您想要坚持使用标准Java API - 您可以使用正确的Calendar和时区创建Date对象,然后设置时间组件为0。

但是,使用Joda Time开头会更好,而LocalDate类型会更准确地反映出您感兴趣的内容。

答案 2 :(得分:2)

Calendar.set()Calendar.HOUR_OF_DAYCalendar.MINUTECalendar.SECONDCalendar.MILLISECOND一起使用,将所有这些字段设置为0。

这个重复问题的答案很有用:Resetting the time part of a timestamp in Java

答案 3 :(得分:1)

在下面找到一个采用Joda Time并支持时区的解决方案。 因此,您将在JVM中当前配置的时区中获取日期和时间(Bookings.get({"day": TODAY}).$promise.then(function(data) { $scope.todaysBookings = data.total; }); Bookings.get({"day": TOMORROW}).$promise.then(function(data) { $scope.tomorrowsBookings = data.total; }); currentDate)。

请注意,Joda Time不支持闰秒。所以,你可以离开真正价值26或27秒。这可能只会在未来50年内解决,届时累积误差将接近1分钟,人们将开始关注它。

另请参阅:https://en.wikipedia.org/wiki/Leap_second

currentTime

答案 4 :(得分:1)

TL;博士

LocalDate ld = 
    myUtilDate.toInstant()
              .atZone( ZoneId.of( "America/Montreal" ) )
              .toLocalDate() ;

避免遗留日期时间类

您正在使用麻烦的旧旧日期时间类。避免他们。

而是使用java.time个类。这些取代了旧类以及Joda-Time库。

转换

java.util.Date转换为Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = myUtilDate.toInstant();

时区

申请时区。时区至关重要。对于任何特定时刻,日期在全球范围内因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,同时也是魁北克蒙特利尔的“昨天”。

应用ZoneId获取ZonedDateTime个对象。

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

Local…个类型

LocalDate类表示没有时间且没有时区的仅限日期的值。同样,LocalTime表示没有日期且没有时区的时间。您可以将这些视为两个组件,而ZoneId组成ZonedDateTime。您可以从ZonedDateTime

中提取这些内容
LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();

字符串

如果您的目标只是生成字符串以便向用户显示,则不需要Local…类型。相反,使用DateTimeFormatter生成仅表示日期部分或时间部分的字符串。该类足够聪明,可以在生成String时自动localize

指定Locale以确定(a)用于翻译日期名称,月份名称等的人类语言,以及(b)用于确定缩写,大小写,标点符号等问题的文化规范,等等。

Locale l = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.

DateTimeFormatter fDate = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
String outputDate = zdt.format( fDate );

DateTimeFormatter fTime = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputTime = zdt.format( fTime );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。