首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取java中两个日期之间的天数差。

问无法获取java中两个日期之间的天数差。
EN

Stack Overflow用户
提问于 2012-01-13 14:45:05
回答 9查看 5.2K关注 0票数 0

我想计算两个日期之间的天数差。当日期的年份不变时,我的代码工作得很好,但是当我计算两个日期之间的差值时:(13/01/2012到13/12/2011),它给出了一个负值。当我计算今天日期和未来日期之间的差值时,它也会给出错误的差异值。请帮帮我。提前谢谢你。下面是我的代码:

代码语言:javascript
复制
//getting values from text box
String fromtext = from.getText().toString();
String totext = to.getText().toString();
//sdf if a simple date formatter
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date fromdate = (Date) sdf.parse(fromtext);
Date todate = (Date) sdf.parse(totext);

Calendar fromcal = Calendar.getInstance();
Calendar tocal = Calendar.getInstance();


    fromcal.setTime(fromdate);
    tocal.setTime(todate);// setting to date


    int reportDays=(int)(todate.getTime()-fromdate.getTime())/(3600*24*1000);

请告诉我计算天数差额的最佳方法是什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-01-13 14:58:20

除了已经提到的格式问题之外,您可能还会遇到溢出。试试这个:

代码语言:javascript
复制
int reportDays=(int)((todate.getTime()-fromdate.getTime())/(3600*24*1000));
票数 1
EN

Stack Overflow用户

发布于 2012-01-13 14:48:57

日期输入:13/01/2012、13/12/2011

格式似乎是dd/MM/yyyy,但您使用了错误的格式(如MM/dd/yyyy)

票数 6
EN

Stack Overflow用户

发布于 2017-03-25 18:42:47

tl;dr

代码语言:javascript
复制
ChronoUnit.DAYS.between(
    LocalDate.parse( "13/01/2012" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
    LocalDate.parse( "13/12/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
)

使用java.time

用现代的java.time类取代麻烦的旧的遗留日期-时间类,比如Date & Calendar,要容易得多。

代码语言:javascript
复制
(13/01/2012 to 13/12/2011),

LocalDate类表示不带时间和时区的仅日期值。

代码语言:javascript
复制
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate start = LocalDate.parse( "13/01/2012" , f );
LocalDate stop = LocalDate.parse( "13/12/2011" , f );

使用ChronoUnit计算经过的天数。

代码语言:javascript
复制
long days = ChronoUnit.DAYS.between( start , stop );

当然,当回到过去的时候,天数是负的。注意您的停止日期是如何早于您的开始日期的。

在确定日期时,时区至关重要。在任何给定的时刻,全球各地的日期都会因地区而异。例如,午夜过后的几分钟在Paris France中是新的一天,而在Montréal Québec中仍然是“昨天”。

指定continent/region格式的proper time zone name,如America/Montreal、Africa/Casablanca或Pacific/Auckland。切勿使用3-4个字母的缩写,例如EST或IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

您可以再次使用ChronoUnit来计算未来的天数。

代码语言:javascript
复制
long days = ChronoUnit.DAYS.between( today , today.plusMonths( 7 ) );

关于java.time

java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date、Calendar和SimpleDateFormat。

现在在maintenance mode中的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle Tutorial。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。

从哪里获取java.time类?

  • 和以及后来的
    • 内置。与implementation.
    • Java 9捆绑在一起的标准Java API的
    • 部分添加了一些次要功能和fixes.

​

  • 和.

中的

  • 许多java.time功能已向后移植到Java6和7

​

适用于安卓specifically.

  • See .

的

    • 项目适配ThreeTen-Backport (如上所述

​

项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和more。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8846880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档