Java 无法找到两个日期(时间、秒、月和年)之间的差异?
这是我的java类Java 无法找到两个日期(时间、秒、月和年)之间的差异?,java,simpledateformat,Java,Simpledateformat,这是我的java类 public class dateparse { public static void main(String args[]) throws ParseException { Date dd=new Date(); int year = Calendar.getInstance().get(Calendar.YEAR); int month=0; int calc_days=0; String d1 = dd.getDate(
public class dateparse {
public static void main(String args[]) throws ParseException
{
Date dd=new Date();
int year = Calendar.getInstance().get(Calendar.YEAR);
int month=0;
int calc_days=0;
String d1 = dd.getDate()+"/"+dd.getMonth()+"/"+year;
String d2 = "19/1/2014";
SimpleDateFormat s1 = new SimpleDateFormat("dd/mm/yyyy");
SimpleDateFormat s2 = new SimpleDateFormat("dd/mm/yyyy");
Date dateOne = new SimpleDateFormat("dd/mm/yyyy").parse(d1);
Date dateTwo = s2.parse(d2);
long diff = dateOne.getTime() - dateTwo.getTime();
calc_days= (int) (diff / 1000 / 60 / 60 / 24 / 1);
}
}
我正在尝试查找当前日期与指定日期(秒、分钟、小时、天、月和年)之间的差异。此处我的输入日期为2014年2月19日。我想以天数表示差异。例如。10天或月+日,例如1个月和2天或年+月+日。1年零2个月零4天。但当我运行此代码时,返回的差值为-10天。您的错误是解析。小写字母m表示分钟,而不是月份:
SimpleDateFormat s2 = new SimpleDateFormat("dd/mm/yyyy");
应该是:
SimpleDateFormat s2 = new SimpleDateFormat("dd/MM/yyyy");
下面是一个简化的示例:
String d1 = "21/1/2014";
String d2 = "19/1/2014";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date dateOne = sdf.parse(d1);
Date dateTwo = sdf.parse(d2);
long diff = dateOne.getTime() - dateTwo.getTime();
int differenceInDays = (int) (diff / 1000 / 60 / 60 / 24 / 1);
System.out.println(differenceInDays);
Prints:2这是由Java提供的可怕API导致的经典错误:
date.getMonth返回1月为0,2月为1。。。12月11日。如果可以,请尽量避免使用java.util.Date和Calendar:P
注意-接受的答案是错误的!证明:
使用我的欧洲/柏林时区中的日期2014-03-19和2014-04-01作为输入。真正的答案是13天,因为每个人都可以很容易地使用标准日历,但公认的@Duncan代码会产生12天,因为在我的时区中有一个dst跳转,它打破了计算公式1天=24小时的基础。3月30日那天只有23个小时 JDK pre 8没有为这个问题提供内置的通用解决方案。还请注意,您的输入只是一对没有时间的两个普通日期。因此,要求以秒为单位的差异是愚蠢的。仅要求以天、月、周或年为单位的差异是明智的。在Java 8中,您可以执行以下操作:// only days
LocalDate start = LocalDate.of(2014, 3, 19); // start in March
LocalDate end = LocalDate.of(2014, 4, 1);
int days = ChronoUnit.DAYS.between(start, end); // 13
// period in years, months and days
LocalDate start = LocalDate.of(2014, 2, 19); // start in February
LocalDate end = LocalDate.of(2014, 4, 1);
Period period = Period.between(start, end); // P1M13D = 1 month + 13 days
不幸的是,你不能自由选择你想要的日历单位来表达差异。JodaTime和我的库使用PeriodType有一种更灵活的方法。为什么你有那么多奇怪的代码来创建日期,将其拆分并再次解析?duplicate@Duncan实际上我从某个站点复制了该代码。现在我想用它来计算剩余天数。需要问最后一件事,我是否使用s1.parsed1而不是新的SimpleDataFormatdD/mm/yyyy.parsed1;它抛出exception@TruePS调整您的代码以匹配我的示例,您将不会收到异常。如果您不能这样做,请更详细地解释您收到的异常。公共类测试{public static void mainString args[]抛出ParseException{日期d1;字符串s=04-30-2013;SimpleDataFormat ft=new SimpleDataFormatDD/MM/yyyy;d1=ft.parses;System.out.printlnk;System.out.printlnft.formatd1;}}在我收到的代码中exception@TruePS不能期望与dd/MM/yyyy匹配的格式与格式为MM-dd-yyyy的日期匹配。