当前位置: 首页 > 面试题库 >

Java用这种格式减去两个日期

上官鸿朗
2023-03-14
问题内容

我正在从一个字符串中解析两个日期,如下所示:

Oct 15, 2012 1:07:13 PM
Oct 23, 2012 03:43:34 PM

我需要做的是找出这两个日期之间的区别,例如:

Oct 23, 2012 03:43:34 PM - Oct 15, 2012 1:07:13 PM

= 8天2小时36分钟21秒

^这是我需要的两个日期/时间

我相信我需要解析格式并将其转换为另一种格式,然后减去两者之间的差并进行数学运算以得出之间的天/小时/分钟/秒


问题答案:

与其他回答者试图暗示的相反,在标准Java SE中,计算两个日期之间的差异并不是那么简单。

您的第一步确实是将这些字符串转换为可用Date实例。您可以使用进行此操作SimpleDateFormat。这是一个启动示例:

String string1 = "Oct 15, 2012 1:07:13 PM";
String string2 = "Oct 23, 2012 03:43:34 PM";

SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.ENGLISH);

Date date1 = sdf.parse(string1);
Date date2 = sdf.parse(string2);

(请注意Locale此处可选参数的重要性,在有关将字符串转换为日期的答案中常常忽略了这一点)

下一步是计算这两个日期之间的差。当您仅限于标准Java SE
API时,这是一项艰巨的任务。最好的是您可以得到的java.util.Calendar

请注意,您当然可以减去毫秒,然后使用常规算术运算符计算差值。

long differenceInMillis = date2.getTime() - date1.getTime();
// ...

但是,这种幼稚的方法没有考虑leap年,更不用说夏时制和日期时间的本地特定更改了。

对于该java.util.Calendar方法,您 基本上
需要Calendar#add()在计数器循环中使用以获取数年,数月和数天的经过值。这需要适当考虑leap年,夏时制和当地时间的干扰。

首先创建此帮助程序方法以消除一些样板代码

public static int elapsed(Calendar before, Calendar after, int field) {
    Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
    int elapsed = -1;
    while (!clone.after(after)) {
        clone.add(field, 1);
        elapsed++;
    }
    return elapsed;
}

现在,您可以计算出经过时间,如下所示:

Calendar start = Calendar.getInstance();
start.setTime(date1);
Calendar end = Calendar.getInstance();
end.setTime(date2);

Integer[] elapsed = new Integer[6];
Calendar clone = (Calendar) start.clone(); // Otherwise changes are been reflected.
elapsed[0] = elapsed(clone, end, Calendar.YEAR);
clone.add(Calendar.YEAR, elapsed[0]);
elapsed[1] = elapsed(clone, end, Calendar.MONTH);
clone.add(Calendar.MONTH, elapsed[1]);
elapsed[2] = elapsed(clone, end, Calendar.DATE);
clone.add(Calendar.DATE, elapsed[2]);
elapsed[3] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 3600000;
clone.add(Calendar.HOUR, elapsed[3]);
elapsed[4] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 60000;
clone.add(Calendar.MINUTE, elapsed[4]);
elapsed[5] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 1000;

System.out.format("%d years, %d months, %d days, %d hours, %d minutes, %d seconds", elapsed);

是的,非常难看。

如果您打算经常用Java处理日期和时间,那么您可能会发现Joda time是walhalla。这是一个具体的启动示例,说明如何使用纯Joda Time来完成所有操作:

String string1 = "Oct 15, 2012 1:07:13 PM";
String string2 = "Oct 23, 2012 03:43:34 PM";

DateTimeFormatter dtf = DateTimeFormat.forPattern("MMM d, yyyy h:mm:ss a").withLocale(Locale.ENGLISH);

DateTime dateTime1 = dtf.parseDateTime(string1);
DateTime dateTime2 = dtf.parseDateTime(string2);
Period period = new Period(dateTime1, dateTime2);

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .appendYears().appendSuffix(" years ")
    .appendMonths().appendSuffix(" months ")
    .appendWeeks().appendSuffix(" weeks ")
    .appendDays().appendSuffix(" days ")
    .appendHours().appendSuffix(" hours ")
    .appendMinutes().appendSuffix(" minutes ")
    .appendSeconds().appendSuffix(" seconds ")
    .printZeroNever()
    .toFormatter();

String elapsed = formatter.print(period);
System.out.println(elapsed);

好多了吧?复数形式的“ s”虽然需要一些工作,但这是不可能的。



 类似资料:
  • 问题内容: 我对angularjs相当陌生,但现在就开始了。我可以通过angularjs窗体中的两个日期,但是我需要做的是以某种方式减去两个日期以得到两者之间的天数差异。我创建了一个jQuery函数来执行此操作,但是我不知道如何将两个日期传递给该函数。所以我想知道是否还有其他方法可以解决此问题? 我正在尝试根据两个日期之间要设置样式的某些天之间的天数来设置触发器系统。例如,如果要在10天内使用 样

  • 我以这种格式从数据库中获取日期: 日期格式 当我使用这个字符串创建javascript日期对象时,它会在日期的前一天构建。 您可以在控制台中测试: 你将得到1月31日!我测试了许多理论,但没有一个回答这个问题。 这一天不是从零开始的,否则它将给出2月00日,而不是1月31日 它不是执行数学方程,从月份和/或年份中减去日期 日期(2015-02-01)=1969年12月31日星期三 日期("2015

  • 问题内容: 在Python中,如何减去两个非唯一的无序列表?假设我们有和我想这样做,并有成为或顺序无关紧要给我。如果a在b中不包含所有元素,则应该抛出异常。 请注意,这与套装不同! 我对找到a和b中的元素集的差异不感兴趣,而对a和b中元素的实际集合之间的差异感兴趣。 我可以使用for循环来执行此操作,在a中查找b的第一个元素,然后从b和a中删除该元素,依此类推。但这对我没有吸引力,这会非常低效(按

  • 问题内容: 我想在表中选择所有记录,这些记录的输入日期早于2个月。 知道我该怎么做吗? 我还没有尝试过任何东西,但是我在这一点上: 问题答案: 如果您使用的是SQL Server,请尝试以下操作: 根据您的更新,它将是:

  • 我可以打印当前日期如何使用date对象从当前日期减去2天。无论之前在这个网站上问了什么问题,都不符合我的要求。如果我使用日历,那么我会得到不同格式的日期。我只希望使用date对象以yyyyMMdd格式显示日期。我尝试了这个方法,但我遇到了错误,就像运算符一样——参数类型字符串int未定义。请帮助我解决这个问题。

  • 最近我遇到了一个编程难题,我一生都找不到一个满意的答案:计算字符串给出的两个任意大整数之和,其中第二个整数可能是负数。这是在Java中完成的,没有使用任何BigInteger、BigNumber等类。 我最初使用伪代码的方法如下: 如果第二个字符串的第一个字符是'-',则设置减法标志。 将每个字符串转换为一个整数数组,每个数字一个。 用零扩展最短数组和左键,以便两个数组大小相同。 循环遍历数组的每