代码之家  ›  专栏  ›  技术社区  ›  Samuel

日历的日期对象

  •  66
  • Samuel  · 技术社区  · 16 年前

    开始和停止日期是日期对象(私有日期startDate…) 现在我想通过将持续时间(以分钟为单位)添加到startDate来自动计算stopDate。

    有办法吗?如果有什么最佳实践呢

    7 回复  |  直到 8 年前
        1
  •  100
  •   Lars Andren    11 年前

    您可以做的是创建 GregorianCalendar Date 作为开始时间:

    Date date;
    Calendar myCal = new GregorianCalendar();
    myCal.setTime(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;
    }
    

        2
  •  27
  •   Bozhidar Batsov    14 年前
    Calendar tCalendar = Calendar.getInstance();
    tCalendar.setTime(date);
    

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

        3
  •  6
  •   Michael Borgwardt    16 年前

    Calendar.setTime()

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

        4
  •  6
  •   polygenelubricants    16 年前

    你不需要转换成 Calendar getTime() / setTime() 相反。

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

    setTime(long time) :将此日期对象设置为表示时间点,即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 很容易。

        5
  •  2
  •   Community Mohan Dere    9 年前

    热释光;博士

    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 
    

    如果你的 日历 Gregorian toInstant 得到一个 Instant 对象。这个 Instant 类表示时间线上的某个时刻 UTC 决议 nanoseconds .

    Instant instant = myCal.toInstant();
    

    同样,如果从 java.util.Date 对象,转换为 瞬间 . 这个 类表示时间线上的某个时刻 UTC公司 决议 (最多九(9)位小数)。

    Instant instant = myUtilDate.toInstant();
    

    应用时区以获取 ZonedDateTime .

    ZoneId z = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = instant.atZone( z );
    

    得到一个 日期类型 瞬间 .

    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 该框架内置于Java8及更高版本中。这些课程取代了烦人的旧课程 legacy 日期时间类,例如 java.util.Date , Calendar SimpleDateFormat .

    这个 Joda-Time maintenance mode ,建议迁移到java.time。

    要了解更多信息,请参阅 Oracle Tutorial . 和搜索堆栈溢出的许多例子和解释。规格为 JSR 310

    从哪里获得java.time类?

    ThreeTen-Extra project使用其他类扩展java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如 Interval YearWeek , YearQuarter ,和 more .

        6
  •  0
  •   Xorty    16 年前

    像这样的

    movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
    
        7
  •  0
  •   Vitor Reais    8 年前

    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);
    
        8
  •  0
  •   kulikovman    5 年前

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

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