我想比较两个java.util.Date
对象的日期部分。我怎样才能做到这一点?我不打算分别比较日期,月份和年份。
提前致谢!
答案 0 :(得分:4)
commons-lang DateUtils为这个问题提供了一个很好的解决方案:
通过这种方式,您可以在一行中比较两个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_DAY
,Calendar.MINUTE
,Calendar.SECOND
和Calendar.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)
LocalDate ld =
myUtilDate.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate() ;
您正在使用麻烦的旧旧日期时间类。避免他们。
而是使用java.time个类。这些取代了旧类以及Joda-Time库。
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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance 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的试验场。