日期对象到日历[Java]

时间:2010-04-28 08:01:40

标签: java date calendar

我有一堂课电影 在它我有一个开始日期,持续时间和停止日期。 开始和停止日期是日期对象(私人日期startDate ...) (这是一项任务,所以我不能改变它) 现在我想通过将持续时间(以分钟为单位)添加到startDate来自动计算stopDate。

据我所知,处理Date的时间操作函数已被弃用因此不好练习但在另一方面我看不到将Date对象转换为日历对象以便操纵时间并将其重新转换为Date对象的方法。 有办法吗?如果有什么是最佳实践

8 个答案:

答案 0 :(得分:96)

您可以做的是创建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;
}

通过这种方式,您可以访问开始时间并获取从开始到结束的持续时间。当然,精度取决于你。

答案 1 :(得分:27)

Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

date是一个java.util.Date对象。您也可以使用Calendar.getInstance()来获取Calendar实例(效率更高)。

答案 2 :(得分:6)

Calendar.setTime()

查看API方法的签名和描述通常很有用,而不仅仅是它们的名称:) - 即使在Java标准API中,名称有时也会产生误导。

答案 3 :(得分:6)

为此,您无需转换为Calendar,而只需使用getTime() / setTime()

  

getTime():   返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。

     

setTime(long time):将此Date对象设置为表示1970年1月1日00:00:00 GMT之后的时间毫秒的时间点。 )

一秒钟内有1000毫秒,一分钟内有60秒。算一算吧。

    Date now = new Date();
    Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
    System.out.println(now);
    System.out.println(oneMinuteInFuture);

L中的1000后缀表示它是long字面值;这些计算通常很容易溢出int

答案 4 :(得分:2)

TL;博士

Instant stop = 
    myUtilDateStart.toInstant()
                   .plus( Duration.ofMinutes( x ) ) 
;

java.time

其他答案是正确的,尤其是the Answer by Borgwardt。但那些答案使用过时的遗留类。

与Java捆绑的原始日期时间类已被java.time类取代。在java.time类型中执行业务逻辑。仅在需要使用尚未更新以处理java.time类型的旧代码的情况下转换为旧类型。

如果您的Calendar实际上是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 

如果您的Calendar不是Gregorian,请致电toInstant以获取Instant个对象。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = myCal.toInstant();

同样,如果以java.util.Date对象开头,请转换为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

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() );

有关在旧版日期时间类型和java.time之间进行转换的更多讨论,以及一个漂亮的图表,请参阅my Answer到另一个问题。

Duration

将时间范围表示为Duration个对象。您在持续时间内的输入是问题中提到的分钟数。

Duration d = Duration.ofMinutes( yourMinutesGoHere );

您可以将其添加到开头以确定停止。

Instant stop = startInstant.plus( d ); 

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 5 :(得分:0)

类似

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);

答案 6 :(得分:0)

下面是一个完整的示例,说明如何将日期转换为不同的类型:

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

答案 7 :(得分:0)

用于在 Kotlin 中将日期转换为日历的扩展。

fun Date?.toCalendar(): Calendar? {
    return this?.let { date ->
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar
    }
}