Date object to Calendar [Java]
我有一部课堂电影其中我有一个开始日期、持续时间和结束日期。开始日期和停止日期是日期对象(私有日期开始日期…)(这是一项任务,所以我不能改变)现在,我想通过将持续时间(以分钟为单位)添加到开始日期来自动计算停止日期。
据我所知,不赞成使用日期的时间操作函数,因此这是一种糟糕的做法,但在另一方面,我看不到将日期对象转换为日历对象的方法,以便操作时间并将其重新转换为日期对象。有办法吗?如果有什么最佳实践
您可以创建一个
1 2 3 |
然而,另一种方法是根本不使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } |
。
通过这种方式,您可以访问开始时间和从开始到停止的持续时间。当然,精度由你决定。
日期是java.util.date对象。您也可以使用calendar.getInstance()获取日历实例(效率更高)。
您不需要转换为
getTime() :
Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object.
setTime(long time) : Sets this Date object to represent a point in time that is time milliseconds after January 1, 1970 00:00:00 GMT. )
号
一秒钟有1000毫秒,一分钟有60秒。算算就行了。
1 2 3 4 |
号
查看API方法的签名和描述通常是有用的,而不仅仅是它们的名称:-即使在Java标准API中,名称有时也会误导。
DR
1 2 3 4 | Instant stop = myUtilDateStart.toInstant() .plus( Duration.ofMinutes( x ) ) ; |
。java.time时间
其他答案都是正确的,尤其是鲍格华特的答案。但这些答案使用了过时的传统课程。
与JAVA绑定的原始日期时间类已经被Java.Times类取代。在java.time类型中执行业务逻辑。仅在需要使用尚未更新以处理java.time类型的旧代码时转换为旧类型。
如果你的
1 2 3 4 | 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 |
。
如果你的
1 | Instant instant = myCal.toInstant(); |
同样,如果从
1 | Instant instant = myUtilDate.toInstant(); |
。
应用时区获取
1 2 | ZoneId z = ZoneId.of("America/Montreal" ); ZonedDateTime zdt = instant.atZone( z ); |
要得到一个
。
有关在传统日期时间类型和java.time之间转换的更多讨论,以及一个漂亮的图表,请参阅我对另一个问题的回答。
埃多克斯1〔25〕将时间跨度表示为
1 | Duration d = Duration.ofMinutes( yourMinutesGoHere ); |
号
您可以将其添加到开始以确定停止。
1 | Instant stop = startInstant.plus( d ); |
号关于java.time
JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如
现在处于维护模式的joda time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。
在哪里获取java.time类?
- Java SE 8和SE 9及以后
- 内置。
- 标准JAVA API的一部分与捆绑实现。
- Java 9增加了一些次要的特性和修复。
- Java SE 6和SE 7
- 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
- 安卓
- threetenabp项目专门为Android调整threeten backport(如上所述)。
- 看看如何使用……
threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如
以下是如何转换不同类型日期的完整示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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); |
号
有点像
1 | movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000); |