我有一个电影类:Movie,其中包括开始日期、持续时间和结束日期。开始和结束日期是Date对象(私有的Date startDate...)(这是一个任务所以我不能改变它)。现在我想通过将持续时间(以分钟为单位)添加到开始日期来自动计算停止日期。
据我所知,使用Date的时间操作函数已经过时,因此不好的实践方法,但另一方面,我看不到将Date对象转换为Calendar对象以便操作时间并重新转换为Date对象的方法。是否有方法?如果有,最佳做法是什么?
我有一个电影类:Movie,其中包括开始日期、持续时间和结束日期。开始和结束日期是Date对象(私有的Date startDate...)(这是一个任务所以我不能改变它)。现在我想通过将持续时间(以分钟为单位)添加到开始日期来自动计算停止日期。
据我所知,使用Date的时间操作函数已经过时,因此不好的实践方法,但另一方面,我看不到将Date对象转换为Calendar对象以便操作时间并重新转换为Date对象的方法。是否有方法?如果有,最佳做法是什么?
你可以创建一个GregorianCalendar
的实例,然后将Date
设置为开始时间:
Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);
然而,另一种方法是根本不使用Date
。您可以使用类似于以下方式的方法:
private Calendar startTime;
private long duration;
private long startNanos; //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();
public void setEndTime() {
this.duration = System.nanoTime() - this.startNanos;
}
public Calendar getStartTime() {
return this.startTime;
}
public long getDuration() {
return this.duration;
}
通过这种方式,您可以访问开始时间并获取从开始到停止的持续时间。当然,精度取决于您。
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);
date是一个java.util.Date对象。你也可以使用Calendar.getInstance()来获取日历实例(更加高效)。
Calendar.getInstance()
返回一个与地区相关的 Calendar
实现,因此通常更可取。 - hotshot309Calendar
,你可以使用getTime()
/setTime()
。
getTime()
: 返回此 Date 对象表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
setTime(long time)
:将此 Date 对象设置为表示 1970 年 1 月 1 日 00:00:00 GMT 后 time 毫秒的时间点。
一秒钟有1000毫秒,一分钟有60秒。只需进行简单计算即可。
Date now = new Date();
Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
System.out.println(now);
System.out.println(oneMinuteInFuture);
1000L
中的L
后缀表示这是一个long
型字面量;这些计算通常很容易就会使int
类型发生溢出。Instant stop =
myUtilDateStart.toInstant()
.plus( Duration.ofMinutes( x ) )
;
日历
实际上是一个GregorianCalendar
,你可以将其转换为ZonedDateTime
。查找添加到旧类中的新方法以便于转换为/从java.time类型。if( myUtilCalendar instanceof GregorianCalendar ) {
GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if
toInstant
以获取Instant
对象。Instant
类表示时间线上的一个时刻,在UTC中具有纳秒的分辨率。Instant instant = myCal.toInstant();
java.util.Date
对象开始,将其转换为一个 Instant
。 Instant
类表示一个时间线上的时刻,在 UTC 上,分辨率为 纳秒(小数点后最多九位数字)。Instant instant = myUtilDate.toInstant();
ZonedDateTime
。ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
java.util.Date
对象,请通过 Instant
进行操作。java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );
持续时间
将时间跨度表示为Duration
对象。您在问题中提到的持续时间输入是分钟数。
Duration d = Duration.ofMinutes( yourMinutesGoHere );
Instant stop = startInstant.plus( d );
java.time 框架内置于 Java 8 及以后版本。这些类替代了旧的 遗留 日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于 维护模式,建议迁移到 java.time。
要了解更多,请查看 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310。Interval
}}, YearWeek
, YearQuarter
, 以及更多。将日期转换为日历的 Kotlin 扩展。
fun Date?.toCalendar(): Calendar? {
return this?.let { date ->
val calendar = Calendar.getInstance()
calendar.time = date
calendar
}
}
像这样的
movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
这里是一个完整的示例,演示如何将日期转换为不同类型:
Date date = Calendar.getInstance().getTime();
// Display a date in day, month, year format
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with day name in a short format
formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with a short day and month name
formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Formatting date with full day and month name and show time up to
// milliseconds with AM/PM
formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
today = formatter.format(date);
System.out.println("Today : " + today);
Date
,Calendar
)现在已经过时,多年前被现代的java.time类所取代。 - Basil Bourque