Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日历的日期对象[Java]_Java_Date_Calendar - Fatal编程技术网

日历的日期对象[Java]

日历的日期对象[Java],java,date,calendar,Java,Date,Calendar,我有一部班级电影 在里面我有一个开始日期,一个持续时间和一个停止日期。 开始日期和停止日期是日期对象(私有日期开始日期…) (这是一项作业,所以我无法更改) 现在,我想通过将持续时间(以分钟为单位)添加到startDate来自动计算stopDate 据我所知,使用Date的时间操纵函数是不可取的,因此这种做法很糟糕,但另一方面,我认为没有办法将Date对象转换为calendar对象,以便操纵时间并将其重新转换为Date对象。 有办法吗?如果有什么最佳实践 查看API方法的签名和描述通常很有用,而

我有一部班级电影 在里面我有一个开始日期,一个持续时间和一个停止日期。 开始日期和停止日期是日期对象(私有日期开始日期…) (这是一项作业,所以我无法更改) 现在,我想通过将持续时间(以分钟为单位)添加到startDate来自动计算stopDate

据我所知,使用Date的时间操纵函数是不可取的,因此这种做法很糟糕,但另一方面,我认为没有办法将Date对象转换为calendar对象,以便操纵时间并将其重新转换为Date对象。 有办法吗?如果有什么最佳实践

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

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

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

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

: 返回此日期对象表示的自1970年1月1日00:00:00 GMT以来的毫秒数

:设置此日期对象以表示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);

1000
中的
L
后缀表示它是一个
long
文本;这些计算通常很容易溢出
int

您可以创建
GregoriaCalendar
的实例,然后将
日期设置为开始时间:

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;
}
通过这种方式,您可以访问开始时间和从开始到停止的持续时间。精度当然取决于您。

类似

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
tl;博士 java.time 其他答案尤其正确。但这些答案使用了过时的遗留类

与Java捆绑的原始日期时间类已被Java.time类取代。以java.time类型执行业务逻辑。仅当需要使用尚未更新以处理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 
如果您的帐户实际上是一个,您可以将其转换为
ZoneDateTime
。查找添加到旧类中的新方法,以促进与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 
如果您的
日历
不是
公历
,请调用以获取
即时
对象。该类表示时间线上的一个时刻,分辨率为

类似地,如果从
java.util.Date
对象开始,则转换为
即时
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

应用时区以获取时间

要获取
java.util.Date
对象,请通过
Instant

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );
有关在遗留日期时间类型和java.time之间转换的更多讨论,以及漂亮的图表,请参阅另一个问题

Duration d = Duration.ofMinutes( yourMinutesGoHere );
持续时间
将时间跨度表示为对象。您输入的持续时间是问题中提到的分钟数

Duration d = Duration.ofMinutes( yourMinutesGoHere );
您可以将其添加到起点以确定终点

Instant stop = startInstant.plus( d ); 

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

以下是一个完整的示例,介绍如何将日期转换为不同的类型:

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

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

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

如果你经常使用日期,我发现Joda Time比Java的Date和Calendar类要好得多:分发日期/日历作业的人应该受到惩罚。:-)如果我处在您的位置,我会使用JAVA 7中添加的sane API。类似的问题:
Calendar.getInstance()
返回一个
Calendar
实现,所以它通常更可取。Java的日期/时间实现非常糟糕,我不知道更糟糕的是什么——保留JodaTime——尽管时间计算只是我应用程序整体功能的一小部分——或者切换到日期/日历,花上数小时在本应得到很好实现的半途而废的混乱中跋涉,固体成分。@mellvar是真的。现在您有了第三种选择:java 8和更高版本中内置的java.time类。对于Java6和Java7,大部分Java.time功能已经在ThreeTen Backport项目中进行了后端口。对于早期的Android,请参阅ThreeTenABP项目。至于Joda Time,该项目现在处于维护模式,指定java.Time作为其正式继承人,其创建者Stephen Colebourne领导了这两个项目。这里使用的麻烦的日期时间类(
date
Calendar
)现在是遗留的,几年前被现代的java.Time类取代。
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);
fun Date?.toCalendar(): Calendar? {
    return this?.let { date ->
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar
    }
}