把 java.time 类 从 java 8 到 java 5

Convert java.time classes from java 8 to java 5

提问人:Wasfy 提问时间:8/9/2017 最后编辑:Wasfy 更新时间:8/9/2017 访问量:138

问:

我该怎么做才能在 Java 5 中使用这行代码,因为这段代码使用 threetenbp 与 Java 6 和 7 一起运行,并直接在 Java 8 上运行:

// start date (set the time to start of day)
ZonedDateTime from = LocalDate.parse("2017-07-05").atStartOfDay(ZoneOffset.UTC);
// end date (set the time to 11 PM)
ZonedDateTime to = LocalDate.parse("2017-07-08").atTime(23, 0).atZone(ZoneOffset.UTC);

// get start and end timestamps
long start = from.toInstant().truncatedTo(ChronoUnit.MINUTES).toEpochMilli() / 1000;
long end = to.toInstant().truncatedTo(ChronoUnit.MINUTES).toEpochMilli() / 1000;
日期 时间 java-time threetenbp

评论

0赞 8/9/2017
快速提示:该类具有 方法 ,该方法返回与 相同的方法。当您使用 和 设置时间时,您不需要截断分钟(结果将是相同的,因为分钟、秒和纳秒已经为零)InstantgetEpochSecond()toEpochMilli() / 1000atStartOfDayatTime
1赞 GhostCat 8/9/2017
认真地问问自己,努力移植回一个早已死去的 Java 版本是否真的是你时间和精力的最佳利用。我宁愿考虑升级您拥有的任何仍在使用中并值得将新代码发送到的环境!

答:

2赞 user7605325 8/9/2017 #1

ThreeTen 向后移植似乎只在 Java 6 和 7 中有效。我已经用 JDK 5 进行了测试,它抛出了一个 .UnsupportedClassVersionError

在 Java 5 中,一种替代方法是旧的 和 类:SimpleDateFormatCalendar

// set the formatter to UTC
TimeZone utc = TimeZone.getTimeZone("UTC");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(utc);

// parse and set the time to midnight
Calendar cFrom = Calendar.getInstance(utc);
cFrom.setTime(sdf.parse("2017-07-05"));
cFrom.set(Calendar.HOUR_OF_DAY, 0);
cFrom.set(Calendar.MINUTE, 0);
cFrom.set(Calendar.SECOND, 0);
cFrom.set(Calendar.MILLISECOND, 0);

// parse and set the time to 23:00
Calendar cTo = Calendar.getInstance(utc);
cTo.setTime(sdf.parse("2017-07-08"));
cTo.set(Calendar.HOUR_OF_DAY, 23);
cTo.set(Calendar.MINUTE, 0);
cTo.set(Calendar.SECOND, 0);
cTo.set(Calendar.MILLISECOND, 0);

// get the epoch second (get millis and divide by 1000)
long start = cFrom.getTimeInMillis() / 1000;
long end = cTo.getTimeInMillis() / 1000;

另一种选择是使用 Joda-Time,它的 API 与以下内容非常相似:java.time

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;

DateTime from = LocalDate.parse("2017-07-05").toDateTimeAtStartOfDay(DateTimeZone.UTC);
DateTime to = LocalDate.parse("2017-07-08").toDateTime(new LocalTime(23, 0), DateTimeZone.UTC);

long start = from.getMillis() / 1000;
long end = to.getMillis() / 1000;

这将为 和 生成相同的值。startend


请注意:Joda-Time 处于维护模式,并且正在被新的 API 取代,所以我不建议用它开始一个新项目(当然,除非你不能使用新的 API)。
甚至在joda的网站上,它也说:“请注意,Joda-Time被认为是一个基本上”完成“的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310)。

评论

1赞 cello 8/9/2017
另一种选择是JodaTime,一个处理时间的库,也是JSR310的精神之父。
1赞 8/9/2017
@cello确实如此!我忘记了它,因为 Joda-Time 处于维护模式,我停止将它用于新项目,但在这种情况下,它是一个不错的选择。我已经更新了答案,非常感谢!