我想在java中实现类似的操作:
time = "2014-05-19 13:36:05"
interval = "60 (seconds)"
time - interval = "2014-05-19 13:35:05"
在Java
,在以下约束下表达这一点的最佳方法是什么:
日期时间是格式化字符串。
间隔为整数。
计算的时间也应该是日期时间格式的字符串。
你应该使用"Date"对象,在做减法时,它基本上表示一个时间实例(自Unix纪元以来的毫秒数(。一旦你有一个"Date"对象,你可以使用"getTime"方法(http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime(((来获取这个毫秒值,并减去60秒(确保使用毫秒而不是秒!(,然后用这个结果值创建一个新的"Date"。
这是一种方法。有很多,乔达图书馆也相当受欢迎。它有一个从其日期表示中减去毫秒的方法,http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minusSeconds(int(。
尝试使用 joda-time 库。
下面是用于分析日期字符串的类。
用:
dateTime.minusSeconds(int sec);
减去间隔的方法。
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
请参阅 IdeOne.com 中的实时代码。
请注意,LocalDateTime
缺少时区或 UTC 偏移量的任何概念。所以这并不代表时间轴上的一个时刻。应用区域或偏移(如果您知道是有意的(。已经在堆栈溢出上多次覆盖;搜索OffsetDateTime
和ZonedDateTime
。
至于数据库和SQLite,还有许多其他问题和答案已经在处理这个问题。您的 JDBC 4.2 驱动程序可以直接处理 java.time 类型的转换。如果没有,请使用标准 ISO 8601 格式存储为字符串。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
从哪里获得java.time类?
- Java SE 8 和 SE 9 及更高版本
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9添加了一些小功能和修复。
- Java SE 6 和 SE 7
- 许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7。
- 人造人
- ThreeTenABP项目专门为Android改编了ThreeTen-Backport(如上所述(。
- 请参阅如何使用...。
ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。
您应该只使用字符串的日期对象。仅当您想要显示日期时,才将日期格式化为字符串。
使用 Date 对象,您将能够获取以 ms 为单位的值并对其进行计算。您还可以使用"日历"来细分日期。
您不应该使用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);
但同样,你不应该这样做。
你可以使用这样的东西:
长分钟=1000*60;日期 日期1 = 新日期((;当前日期日期日期2 = 新日期(日期1.getTime(( - 分钟(;新日期,早 1 分钟
或其他方法长分钟=1000*60;日期 日期1 = 新日期((;date1.setTime(date1.getTime(( - 分钟(;
Date 适用于自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒,因此您可以像正常数字一样减去它。