Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java求两个日期的和_Java_Date_Calendar - Fatal编程技术网

用Java求两个日期的和

用Java求两个日期的和,java,date,calendar,Java,Date,Calendar,如何在Java中添加两个日期 示例:“2010-01-14 19:16:17”“0000-10-03 01:10:05”之和 将导致“2010-11-1720:26:22” 我知道如何使用日历和添加字段 是否有其他方法可以一次将它们相加(年/月/日/小时/分钟/秒)?如果您使用的是Date对象,您只需执行以下操作: Date d1 = ... Date d2 = ... long sum = d1.getTime() + d2.getTime(); Date sumDate = new Da

如何在Java中添加两个日期

示例:“2010-01-14 19:16:17”“0000-10-03 01:10:05”之和
将导致“2010-11-1720:26:22”

我知道如何使用日历和添加字段


是否有其他方法可以一次将它们相加(年/月/日/小时/分钟/秒)?

如果您使用的是Date对象,您只需执行以下操作:

Date d1 = ...
Date d2 = ...

long sum = d1.getTime() + d2.getTime();

Date sumDate = new Date(sum);
代码使用
.getTime()
方法返回自历元以来的毫秒数。 不用说,
Date
类有很多问题,应该尽可能避免

是否要对其他类型求和

更新:对于
日历
,我将执行以下操作(基于javadocs):


更新:正如Steve所说的,如果您在这里介绍的日期假设第二个日期是关于Java纪元的,那么这个方法就有效了。如果您确实想从年份“0”开始,那么您需要考虑到这一点(通过减去纪元时间)。

一如既往,我建议使用Java 8日期/时间API或日期/时间API,因为它们更强大、更直观

您可以简单地向对象添加持续时间和句点。您可以同样轻松地添加分钟/秒/月


但是,您不能直接添加两个日期,因为这实际上没有意义。这是一个有力的例子,说明了为什么Joda是一个帮助——它阻止了你做那些你真的不应该做的事情。

你想在这两个日历上都做
getTimeInMillis()
,这样你就有了两个诚实的
长的
值可以相加。然后,您可以使用新日历的
setTimeInMillis()
方法获取总和并将其存储在新日历中

当然,您是想添加两个如上所示的
日历
s,还是想添加两个如notnoop的答案所示的
日期
s,这取决于您自己。效果是相似的,只是取决于你想对结果做什么。
日期
主要用于存储和/或转换为字符串以便打印或显示,而
日历
则允许您在选择时处理各个时间值


正如其他人所提到的,您在使用
日期
日历
时犯了一些概念上的“不”,这意味着要将“真实”的日期和时间(例如20世纪或21世纪的日期和时间)存储为间隔,即时间跨度。标准Java库中的类没有提供真正有用的工具来处理这个问题,这就是为什么开发了Joda类。所有处理日期/时间的酷孩子都使用这些;但另一方面,这涉及到下载和管理第三方库。

notnoop的答案绝对正确。然而,如果您要对日期、时间和间隔进行大量处理,我建议您查看库中和库中的类DateUtils


JDK7将更好地支持joda time提供的一些特性。只是说。。。如果你的应用大量使用这些东西,这可能是一个考虑因素。

你需要定义你的时代。Java时代(如Unix)是1970年1月1日GMT/UTC。我假设你认为从10000年1月1日算起,加上10个月,3天,还有一些奇数小时,但在1970年之前,你有一个历元偏移量。数学可能不一定有用


使用日历或Joda(如上所述)。如果您只是想添加秒数和天数(&c),那么可以随意向第一个date对象添加毫秒。

我偶尔也会犯这种错误,将时间间隔存储在date对象中,并按照notnoop的建议使用getTime()


它起作用了。与某些观点相反,它确实有效。我只是忽略了间隔可能代表一个意外的日期。对我来说,给一个日期加上一个时间间隔是一种既快又脏的方式,比如说,[6年,6个月,6天,6小时,6分钟,6秒]。

不要把两个日期的时间加在一起

Date d1 = new Date();
Date d2 = new Date();
Date dTotal = new Date(d1.getTime() + d2.getTime());
System.out.println(dTotal); // Incorrect! Misses about 1970 years.
只需克隆
日历
并逐个添加日期时间部分

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
Calendar cTotal = (Calendar) c1.clone();
cTotal.add(Calendar.YEAR, c2.get(Calendar.YEAR));
cTotal.add(Calendar.MONTH, c2.get(Calendar.MONTH) + 1); // Months are zero-based!
cTotal.add(Calendar.DATE, c2.get(Calendar.DATE));
cTotal.add(Calendar.HOUR_OF_DAY, c2.get(Calendar.HOUR_OF_DAY));
cTotal.add(Calendar.MINUTE, c2.get(Calendar.MINUTE));
cTotal.add(Calendar.SECOND, c2.get(Calendar.SECOND));
cTotal.add(Calendar.MILLISECOND, c2.get(Calendar.MILLISECOND));
System.out.println(cTotal.getTime()); // Correct!

不用说,JodaTime更智能、更干净。

使用calendar类add方法在java中添加两个日期

Calendar calendar=Calendar.getInstance();

calendar.add(Calendar.Date,23);

calendar.add(Calendar.Month,13);

calendar.add(Calendar.Year,15);
通过在Calendar类中使用add方法,我们可以将天、月、年添加到现有日期

tl;博士 ISO 8601 使用与瞬间相同的格式表示时间跨度会造成混乱。跨度与弯矩完全不同

我建议在一段时间内使用标准格式,而不是使用
YYYY-MM-DD HH-MM-SS
格式。在这种格式中,
P
标记开始(大概是“期间”),而
T
将年-月-日部分与时-分-秒部分分开

示例值:

  • PT1H30M
    → 一个半小时
  • P3Y6M4DT12H30M5S
    → 三年六个月四天十二小时三十分零五秒
  • P10M3DT1H10M5S
    → 您的问题持续时间为
    0000-10-03 01:10:05
java.time 这个问题和其他答案使用了麻烦的旧日期时间类,这些类现在已经被内置在Java8和更高版本中的框架所淘汰。看见大部分java.time功能已在中向后移植到java 6和7,并在中进一步适应Android

在解析和生成表示日期时间值的字符串时,java.time类默认使用ISO 8601格式

这个问题没有提供任何时区信息,所以这里我们使用这个类。如果我们知道UTC的偏移量,我们将使用
OffsetDateTime
类,如果我们更好地知道时区,我们将使用
zoneDateTime

java.time中的时间跨度被划分为一对类。年、月、日由类表示,小时、分钟、秒由类处理

结合这些时间,我们确实可以执行日期时间数学。在这里,我们向起始d添加一个时间跨度
Calendar calendar=Calendar.getInstance();

calendar.add(Calendar.Date,23);

calendar.add(Calendar.Month,13);

calendar.add(Calendar.Year,15);
LocalDateTime later = 
    LocalDateTime
    .parse ( 
        "2010-01-14 19:16:17"
        .replace ( " " , "T" ) 
    )
    .plus( Period.parse ( "P10M3D" ) )
    .plus( Duration.parse ( "PT1H10M5S" ) ) 
;
LocalDateTime ldt = LocalDateTime.parse ( "2010-01-14 19:16:17".replace ( " " , "T" ) );
//"0000-10-03 01:10:05"
Period period = Period.parse ( "P10M3D" );
Duration duration = Duration.parse ( "PT1H10M5S" );
LocalDateTime result = ldt.plus ( period ).plus ( duration );
LocalDateTime expectation = LocalDateTime.parse ( "2010-11-17 20:26:22".replace ( " " , "T" ) );
Boolean isSame = result.equals ( expectation );
System.out.println ( "ldt: " + ldt + " + period: " + period + " + duration: " + duration + " is result: " + result + " compared to expectation: " + expectation + " is the same: " + isSame );