java中日期的天数差异导致输出错误
嗨,我正在计算两个日期在几天内的差值。日期是本月14日和今天。应该是2。但o/p始终为0。 代码: o/p: 0 怎么了 现在我做了另一个技巧,它给出了完美的答案不知道上面的代码有什么问题java中日期的天数差异导致输出错误,java,date,Java,Date,嗨,我正在计算两个日期在几天内的差值。日期是本月14日和今天。应该是2。但o/p始终为0。 代码: o/p: 0 怎么了 现在我做了另一个技巧,它给出了完美的答案不知道上面的代码有什么问题 SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy"); long firstdateseconds = df.parse("14.03.2014").getTime(); long today = df.parse("16.0
SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy");
long firstdateseconds = df.parse("14.03.2014").getTime();
long today = df.parse("16.03.2014").getTime();
long difference = (today-firstdateseconds);
long days = (long)(difference/(24*3600*1000));
System.out.println(days);
o/p:2//现在答对了
伙计们,发生了什么事?使用double当您遇到截断问题时我使用以下简单代码来完成您想要的:
import java.util.Date;
public class datediff {
public static void main(String[] args) {
Date d1 = new Date();
Date d2 = new Date(2014 - 1900, 2, 14);
long d1_millis = d1.getTime();
long d2_millis = d2.getTime();
long diffMillis = d1_millis - d2_millis;
long diffDays = diffMillis / (24 * 3600 * 1000);
System.out.println("Difference in days: " + diffDays);
}
}
输出:
日差:2
还请注意,计算差值时使用的幻数不正确 要减去的实际值为:1394735400000 这是使用幻数最危险的缺点
希望这能为您澄清问题。也许是时区和“时间(小时/分钟/秒)”的综合问题 案例一 不同的时区和不同的白天时间:
public static void main(final String[] args) {
final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);
final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);
final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");
}
这张照片是:
差异=0天(s)
案例二
但是,调整时区:
public static void main(final String[] args) {
final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);
final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii")); // <- CHANGE!
march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);
final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");
}
publicstaticvoidmain(最终字符串[]args){
最终日历march14=Calendar.getInstance(TimeZone.getTimeZone(“美国/夏威夷”);
2014年3月14日,3月14日,23日,59日,0日;
最终日历march16=Calendar.getInstance(TimeZone.getTimeZone(“美国/夏威夷”));//你应该试着打印出中间值,看看发生了什么。还有,神奇的数字是什么?@oli:这是一个毫秒的时间戳,对应于3月14日。@MarcB:是的,我假设;)但是我想知道为什么OP会硬编码,而不是简单地显式地构造它。可能是这样的用difference
除以int
。如果使用API,就不必担心这样的计算。使用double
做什么?现在这样做了:longtoday=(new java.util.Date().getTime());double difference=(double)(今天-139480989186.0);double daysdifference=差异/(24*3600*1000);o/p:0.008885162037037037当我在netbeans中使用long时,它表示数字太长了。之所以使用double,是因为有一个除法,如果一天没有过去,它会被截断为0。请检查Javadoc中Date
构造函数的输入范围……我简化了代码并给出了输出。
public static void main(final String[] args) {
final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);
final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii")); // <- CHANGE!
march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);
final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");
}
public static void main(final String[] args) {
final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
march14.set(2014, Calendar.MARCH, 14, 0, 0, 0); // <- CHANGE!
final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);
final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");
}