Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有更好的方法将日历日期归零?_Java_Android_Date_Calendar - Fatal编程技术网

Java 有没有更好的方法将日历日期归零?

Java 有没有更好的方法将日历日期归零?,java,android,date,calendar,Java,Android,Date,Calendar,我想看看是否有更好的方法获得与以下代码相同的结果: Calendar date = Calendar.getInstance(); date.setTimeInMillis(System.currentTimeMillis()); date.set(Calendar.HOUR_OF_DAY, 0); date.set(Calendar.MINUTE, 0); date.set(Calendar.SECOND, 0); date.set(Calendar.MILLISECOND, 0); 我用这

我想看看是否有更好的方法获得与以下代码相同的结果:

Calendar date = Calendar.getInstance();
date.setTimeInMillis(System.currentTimeMillis());
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
我用这个来比较两个日期之间的天数差异。我目前正在为目标API 24编写代码,对使用Joda Time完成这样一项简单的任务不感兴趣

我提出了下面的函数,但我很想知道是否有一种更简单的方法,也许是内置的,用于将日期归零,或者是一种完全不同的方法来计算两个日期之间的天数

private long getFlatDateInMillis() {
    Calendar currentDate = Calendar.getInstance();
    currentDate.setTimeInMillis(System.currentTimeMillis());
    currentDate.set(Calendar.HOUR_OF_DAY, 0);
    currentDate.set(Calendar.MINUTE, 0);
    currentDate.set(Calendar.SECOND, 0);
    currentDate.set(Calendar.MILLISECOND, 0);

    return currentDate.getTimeInMillis();
}
这样,我可以很快使用:

Calendar date = getFlatDateInMillis();
我只是想确保我没有遗漏任何更简单的、已经预先定义好的东西


谢谢大家!

编辑:多亏了Basil和Kareem,我更新了以下代码(因此,更简单):

添加到gradle.build:

compile 'com.jakewharton.threetenabp:threetenabp:1.0.5'
然后在我的活动中等等,

AndroidThreeTen.init(this);

LocalDate today = LocalDate.now();
LocalDate anotherDay = LocalDate.of(2019, 3, 25);
long dayDifference = ChronoUnit.DAYS.between(today, anotherDay); //dayDifference = 365

需要注意的是,日历引用从0索引开始的月份,而LocalDate引用从1索引开始的月份。

正确的方法是使用
java.time.LocalDate
类。它只存储日期,不存储时间,并且有一个
now()
static方法,返回当前日期

LocalDate today = LocalDate.now();
如果你看的是Android,它是在API级别26添加的,但是在Android中使用“新样式”日期类还有其他方法,比如库。

tl;博士 细节 答案是正确的。这里还有一些想法

有没有更好的方法将日历日期归零

是的,有一个更好的方法:不要这样做。

  • 试图清除日期+时间类型上的时间是错误的方法;改为使用仅日期类型()
  • 不要使用麻烦的旧遗留类,例如
    Calendar
    Date
    SimpleDateFormat
    ,因为它们现在已被java.time类取代
两个日期之间的天数差

首先,将传统的
Calendar
对象转换为现代
zoneDateTime
类。若要转换,请调用添加到旧类中的新方法

GregorianCalendar myGregCal = (GregorianCalendar) myJavaUtilCal ; // Cast from superclass to subclass. 
ZonedDateTime zdt = myGregCal.toZonedDateTime() ; // Convert from legacy class to modern class.
提取仅日期值

LocalDate ld = zdt.toLocalDate() ;  // Extract date-only object from date-time object.
以天为单位计算经过的时间

long days = ChronoUnit.DAYS.between( ld , otherLd ) ;
或将经过的时间表示为


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

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

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

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(为什么你需要它。如果它能工作的话。这样的话,问题就离题了。谢谢你的回答。“我只是想确保我没有遗漏任何更简单的、已经预先定义好的东西。”你不能问这样的问题,因为你没有告诉我你认为什么更简单,已经预先定义好了。这个讨论可能会有帮助:
      currentDate.setTimeInMillis(System.currentTimeMillis())否则,这可以用JoDA时间做得更干净。如果你不想使用这些,那么这是很好的。我喜欢这个答案。我必须认真考虑这一点,因为它是可维护的。非常感谢。在Pro 26 Android上使用,请参阅。我想使用Java.Time真的很糟糕(使用起来更容易)。,但不知道Three Ten backport。感谢你们两位。我选择将此标记为答案,只是因为添加了上下文/有用的代码示例。谢谢!
      
      long days = ChronoUnit.DAYS.between( ld , otherLd ) ;
      
      Period p = Period.between( ld , otherLd ) ;