将间隔添加到日期时间

时间:2014-05-19 12:46:58

标签: java datetime

我想在java中实现类似的操作:

time = 2014-05-19 13:36:05
interval = 60 (seconds)
time - interval = 2014-05-19 13:35:05

考虑到以下限制,在Java中表达此问题的最佳方法是什么:

  • 日期时间是格式化字符串。

  • 间隔是一个整数。

  • 计算出的时间也应该是日期时间格式化的字符串。

6 个答案:

答案 0 :(得分:4)

您应该使用"日期"对象,基本上表示执行减法时的实例(自Unix纪元以来的毫秒数)。一旦你有一个"日期"你可以使用的对象" getTime"方法(http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime())获取此毫秒值,并减去60秒(确保使用毫秒而不是秒!),并创建一个新的"日期"由此产生的价值。

这是一种方法。有很多,Joda图书馆也很受欢迎。它有一种从日期表示http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minusSeconds(int)中减去毫秒的方法。

答案 1 :(得分:2)

尝试使用joda-time库。

Here是解析日期字符串的类。

使用:

dateTime.minusSeconds(int sec);

减去你的间隔的方法。

答案 2 :(得分:1)

您应该只使用String的Date对象instread。只有在您想要显示日期时才将日期格式化为字符串。

使用Date对象,您将能够以ms为单位获取值并对其进行计算。您还可以使用Calendar细分日期。

答案 3 :(得分:1)

您不应该使用String个对象,而应使用Date。只有在您想要显示时才格式化日期。

Date originalDate = new Date();
long diff = 60 * 1000; // milliseconds!

Date diffedDate = new Date(originalDate.getTime() - diff);

如果真的希望以字符串的方式(你应该)这样做,你可以像这样解析日期字符串:

String originalDateString = getDateTime(); // your current function
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date badlyDesignedOriginalDate = dateFormat.parse(originalDateString);
long diff = 60 * 1000; // milliseconds!
Date diffedDate = new Date(badlyDesignedOriginalDate.getTime() - diff);

但是,你不应该这样做。

答案 4 :(得分:1)

java.time

现代的方法是使用java.time类。

不要将时间点(片刻)与时间跨度(持续时间)混淆。避免使用时间表示法表示时间跨度,因为这会产生歧义和混淆。使用标准的ISO 8601格式化字符串来表示持续时间:PnYnMnDTnHnMnS

不要将日期时间值(对象)与字符串表示混淆。日期时间对象可以解析或生成字符串,但它与字符串不同且独立。

java.time框架丰富了各种日期时间类。使用它们将数据表示为对象而不仅仅是数字和字符串。

默认情况下,java.time类使用标准的ISO 8601格式化字符串。

String input = "2014-05-19T13:36:05" ;
LocalDateTime ldt = LocalDateTime.parse( input );
Duration d = Duration.ofSeconds( 60 );
LocalDateTime later = ldt.plus( d );
  

ld.toString():2014-05-19T13:36:05

     

d.toString():PT1M

     

later.toString():2014-05-19T13:37:05

请参阅live code in IdeOne.com

请注意LocalDateTime缺少任何时区概念或从UTC偏移。所以代表时间轴上的一个时刻。如果您知道某个区域或偏移,则应用区域或偏移。已经在Stack Overflow上多次报道过;搜索OffsetDateTimeZonedDateTime

至于数据库和SQLite,还有很多其他问题和答案已经在处理这个问题。 JDBC 4.2驱动程序可以直接处理java.time类型的转换。如果没有,请使用标准ISO 8601格式存储为字符串。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 5 :(得分:0)

您可以使用以下内容:

long minute = 1000*60;
Date date1 = new Date(); //current date
Date date2 = new Date(date1.getTime() - minute); //new date, 1 minute older
//or another method
long minute = 1000*60;
Date date1 = new Date();
date1.setTime(date1.getTime() - minute);

日期适用于自1970年1月1日00:00:00 GMT以来的毫秒数,因此您可以像普通数字一样将其减去。