Java,获取两个日期之间的天数
在java中,我想得到两个日期之间的天数,不包括这两个日期 例如: 如果第一个日期为2011年11月11日,第二个日期为2011年11月13日 那么它应该是Java,获取两个日期之间的天数,java,date,Java,Date,在java中,我想得到两个日期之间的天数,不包括这两个日期 例如: 如果第一个日期为2011年11月11日,第二个日期为2011年11月13日 那么它应该是1 这是我正在使用但不起作用的代码(secondDate和firstDate是Calendar对象): 我甚至试着把结果四舍五入,但没有用 如何获得java中日期之间的天数(不包括天数本身)?我有两个建议: 确保您的浮动日\u计数计算正确 浮动日计数=((浮动)差异)/(24f*60f*60f*1000f) 如果是舍入错误,请尝试使用方法 d
1
这是我正在使用但不起作用的代码(secondDate
和firstDate
是Calendar
对象):
我甚至试着把结果四舍五入,但没有用
如何获得java中日期之间的天数(不包括天数本身)?我有两个建议:
浮动日\u计数计算正确
浮动日计数=((浮动)差异)/(24f*60f*60f*1000f)
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
date1.clear();
date1.set(
datePicker1.getYear(),
datePicker1.getMonth(),
datePicker1.getDayOfMonth());
date2.clear();
date2.set(
datePicker2.getYear(),
datePicker2.getMonth(),
datePicker2.getDayOfMonth());
long diff = date2.getTimeInMillis() - date1.getTimeInMillis();
float dayCount = (float) diff / (24 * 60 * 60 * 1000);
textView.setText(Long.toString(diff) + " " + (int) dayCount);
在这两种情况下(2011年11月10日-2011年11月8日)和(2011年11月13日-2011年11月11日),它都能完美地工作,并给出dayCount=2.0
日期
类型的精度为毫秒。因此,你需要做的第一件事就是把约会安排到没有时间的地方。示例:从23:30 2011-11-01
到00:30 2011-11-02
只有一个小时,但这两个日期在不同的日子如果您只打算处理1900年和2100年之间的日期,有一个简单的计算,它将为您提供自1900年以来的天数:
public static int daysSince1900(Date date) {
Calendar c = new GregorianCalendar();
c.setTime(date);
int year = c.get(Calendar.YEAR);
if (year < 1900 || year > 2099) {
throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099");
}
year -= 1900;
int month = c.get(Calendar.MONTH) + 1;
int days = c.get(Calendar.DAY_OF_MONTH);
if (month < 3) {
month += 12;
year--;
}
int yearDays = (int) (year * 365.25);
int monthDays = (int) ((month + 1) * 30.61);
return (yearDays + monthDays + days - 63);
}
public static int daysSince1900(日期){
日历c=新的公历日历();
c、 设定时间(日期);
int year=c.get(日历年);
如果(年份<1900 | |年份>2099){
抛出新的IllegalArgumentException(“daysSince1900-日期必须介于1900和2099之间”);
}
年份-=1900;
int month=c.get(日历月)+1;
int days=c.get(日历,月中日);
如果(月<3){
月份+=12;
年--;
}
整数年天数=(整数)(年份*365.25);
国际月日=(国际)(月+1)*30.61);
报税表(年+月+日-63);
}
因此,要获得两个日期之间的天数差,请计算两个日期自1900年以来的天数,并计算差值。我们的daysBetween方法如下所示:
public static Integer getDaysBetween(Date date1, Date date2) {
if (date1 == null || date2 == null) {
return null;
}
int days1 = daysSince1900(date1);
int days2 = daysSince1900(date2);
if (days1 < days2) {
return days2 - days1;
} else {
return days1 - days2;
}
}
public静态整数getDaysBetween(日期日期1、日期2){
如果(date1==null | | date2==null){
返回null;
}
int days1=daysSince1900(日期1);
int days2=daysSince1900(日期2);
如果(第1天<第2天){
返回日2-返回日1;
}否则{
返回日期1-日期2;
}
}
在您的情况下,您需要减去额外的一天(如果两天不相等)
不要问我这个计算是从哪里来的,因为我们从90年代初就开始使用它。获取java.util.Dates之间的天数,忽略夏令时
快速和肮脏的黑客:
public int get_days_between_dates(Date date1, Date date2)
{
//if date2 is more in the future than date1 then the result will be negative
//if date1 is more in the future than date2 then the result will be positive.
return (int)((date2.getTime() - date1.getTime()) / (1000*60*60*24l));
}
此功能将在99.99%的时间内工作,除非稍后在闰秒、夏令时、时区更改闰年等边缘情况下让您感到意外。如果您同意每隔1(或2)小时停止计算一次,这就足够了
获取日期之间的天数,考虑闰秒、夏令时、时区等
如果你问这个问题,你需要打自己一巴掌。两次约会至少相隔一天意味着什么?这很令人困惑。如果一个日期是一个时区的午夜,而另一个日期是另一个时区的凌晨1点,该怎么办?根据你对它的理解,答案是1和0
您认为您可以强制将日期作为通用时间格式传递到上述函数中,这将解决您的一些问题。但是你只是把问题重新定位到如何将本地时间转换成世界时间。从时区到世界时的逻辑转换可能不是直观的。在某些情况下,当传递的日期明显相隔两天时,你会得到一天的差异
你觉得你能应付吗?世界上有一些落后的日历系统,根据收获季节和政治统治者的不同而不断变化。如果您想将他们的时间转换为UTC,java.util.Date将在最糟糕的时刻让您失望
如果您需要计算日期之间的天数,并且确保一切正常至关重要,那么您需要一个名为Joda Time的外部库:(他们已经为您处理好了所有细节,因此您可以愉快地保持对这些细节的不了解):您在计算之前是否对日期进行了正常化?我的意思是你必须清除字段小时、分钟、秒和毫秒。@slkorolev:哦……我真的不知道。让我再试一次。我应该按照slkorolev的建议清除小时、分钟、秒和毫秒字段吗??或者我可以像以前那样使用?@Hiral我认为这种方法没有必要。但是我还没有测试。我已经测试了两个选项,设置了和没有设置这些字段,但是没有成功!无论如何,谢谢你的回复@Hiral你能在你设置第一个日期和第二个日期的地方发布代码吗?事实上,我使用的是NumberPickerDialog,它给了我相应的日期。它工作得非常好。设置日期没有问题。注:1。不要使用float将毫秒转换为天。2.要从计算中排除这两天,请从
dayCount
中减去1@亚伦:谢谢你的评论,我同意。我认为原始问题的原因不是计算,而是日历初始化。datePicker1在哪里??我如何使用我的日历对象和代码???@Hiral:dattePicker1和2只是我测试应用程序中的复合组件。它们存储输入日期的年、月和日。实际上,这段代码的要点是
public int get_days_between_dates(Date date1, Date date2)
{
//if date2 is more in the future than date1 then the result will be negative
//if date1 is more in the future than date2 then the result will be positive.
return (int)((date2.getTime() - date1.getTime()) / (1000*60*60*24l));
}