将java.time类从java 8转换为java 5

将java.time类从java 8转换为java 5,java,date,time,java-time,threetenbp,Java,Date,Time,Java Time,Threetenbp,我该如何在Java 5中使用这行代码,因为这段代码使用threetenbp在Java 6和Java 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 =

我该如何在Java 5中使用这行代码,因为这段代码使用threetenbp在Java 6和Java 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;
这似乎只在Java6和Java7中起作用。我已经用JDK 5进行了测试,它抛出了一个
不受支持的ClassVersionError

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

// 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;

另一种选择是使用,它的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;
这将为
start
end
生成相同的值


请注意:Joda Time处于维护模式,正在被新的API取代,因此我不建议使用它启动新项目(当然,除非您不能使用新的API)。

甚至在文章中也提到:“请注意,Joda Time被认为是一个基本上“完成”的项目。没有计划进行重大的增强。如果使用Java SE 8,请迁移到Java.Time(JSR-310)。”

快速提示:
Instant
类具有方法
getEpochSecond()
,该方法返回的结果与
toEpochMilli()相同/1000
。当您使用
atStartOfDay
atTime
设置时间时,不需要截断分钟(结果将是相同的,因为分钟、秒和纳秒已经为零)认真地问问自己,努力移植回一个早已过时的Java版本是否真的是对时间和精力的最佳利用。我更愿意研究升级您现有的任何仍在使用且值得发布新代码的环境!另一种选择是:,一个处理时代的图书馆,JSR310的精神之父。@大提琴真的!我忘了它,因为Joda Time处于维护模式,我不再在新项目中使用它,但在这种情况下,它是一个不错的选择。我已经更新了答案,非常感谢!