我想计算两个日期之间的天数差。当日期的年份不变时,我的代码工作得很好,但是当我计算两个日期之间的差值时:(13/01/2012到13/12/2011),它给出了一个负值。当我计算今天日期和未来日期之间的差值时,它也会给出错误的差异值。请帮帮我。提前谢谢你。下面是我的代码:
//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);请告诉我计算天数差额的最佳方法是什么?
发布于 2012-01-13 14:58:20
除了已经提到的格式问题之外,您可能还会遇到溢出。试试这个:
int reportDays=(int)((todate.getTime()-fromdate.getTime())/(3600*24*1000));发布于 2012-01-13 14:48:57
日期输入:13/01/2012、13/12/2011
格式似乎是dd/MM/yyyy,但您使用了错误的格式(如MM/dd/yyyy)
发布于 2017-03-25 18:42:47
tl;dr
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,要容易得多。
(13/01/2012 to 13/12/2011),LocalDate类表示不带时间和时区的仅日期值。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate start = LocalDate.parse( "13/01/2012" , f );
LocalDate stop = LocalDate.parse( "13/12/2011" , f );使用ChronoUnit计算经过的天数。
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,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );您可以再次使用ChronoUnit来计算未来的天数。
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类?
中的
适用于安卓specifically.
的
项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和more。
https://stackoverflow.com/questions/8846880
复制相似问题