我想在java中实现类似的操作:
time = 2014-05-19 13:36:05
interval = 60 (seconds)
time - interval = 2014-05-19 13:35:05
考虑到以下限制,在Java
中表达此问题的最佳方法是什么:
日期时间是格式化字符串。
间隔是一个整数。
计算出的时间也应该是日期时间格式化的字符串。
答案 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)
答案 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类。
不要将时间点(片刻)与时间跨度(持续时间)混淆。避免使用时间表示法表示时间跨度,因为这会产生歧义和混淆。使用标准的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
请注意LocalDateTime
缺少任何时区概念或从UTC偏移。所以不代表时间轴上的一个时刻。如果您知道某个区域或偏移,则应用区域或偏移。已经在Stack Overflow上多次报道过;搜索OffsetDateTime
和ZonedDateTime
。
至于数据库和SQLite,还有很多其他问题和答案已经在处理这个问题。 JDBC 4.2驱动程序可以直接处理java.time类型的转换。如果没有,请使用标准ISO 8601格式存储为字符串。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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以来的毫秒数,因此您可以像普通数字一样将其减去。