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

Java中的今天到期日期

  •  6
  • newbie  · 技术社区  · 15 年前

    5 回复  |  直到 15 年前
        1
  •  5
  •   Andrzej Doyle    15 年前

    使用 java.util.Calendar

    Calendar cal = Calendar.getInstance(); // represents right now, i.e. today's date
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999); // credit to f1sh
    
    Date date = cal.getTime();
    

    不过,我觉得你可能从一个稍微错误的角度来看待这个问题。与其尝试在午夜前创建一个原子的日期实例,更好的方法可能是创建表示午夜的日期并测试当前时间是否正确 严格地 比它小。我相信这会稍微清楚地表明你的意图,让其他人也阅读代码。


    Joda Time 你可以更简单地表达这个概念。例如,Joda Time有一个 DateMidnight 类,该类允许更容易地与正在执行的类型的“原始”日期进行比较,而不会出现微妙的问题(例如在我的第一次剪切中没有设置毫秒)。

        2
  •  1
  •   Christopher Klewes    15 年前

    这将在将来创建一个日期,并将其与当前日期(设置为深夜)进行比较。你应该考虑使用乔达时间图书馆。

    long timeStampOfTomorrow = new Date().getTime() + 86400000L;
    Date dateToCheck = new Date(timeStampOfTomorrow);
    
    
    Calendar today = Calendar.getInstance();
    today.set(Calendar.HOUR_OF_DAY, 23);
    today.set(Calendar.MINUTE, 59);
    today.set(Calendar.SECOND, 59);
    today.set(Calendar.MILLISECOND, 999);
    
    boolean isExpired = dateToCheck.after(today.getTime());
    

    有了乔达时间图书馆,你可以做得更具可读性。一个简单的例子可以在 project website

    public boolean isRentalOverdue(DateTime datetimeRented) {
        Period rentalPeriod = new Period().withDays(2).withHours(12);
        return datetimeRented.plus(rentalPeriod).isBeforeNow();
    }
    
        3
  •  0
  •   naikus    15 年前

    使用 Date.before(Date) 或日期。之后(日期)

    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, 23);
    c.set(Calendar.SECOND, 59);
    c.set(Calendar.MINUTE, 59);
    
    Date d = c.getTime()
    
    Date x = // other date from somewhere
    
    x.after(d);
    
        4
  •  0
  •   Sachin R    15 年前

    找到明天的日期把它转换成毫秒你会得到一个 长的 从中减去-1,然后再次转换为日期,您将得到所需的日期。

    例:明天12:00:00把它转换成毫秒。 你将得到一个长值312313564774

        5
  •  0
  •   Community Mohan Dere    9 年前

    我想你的意思是给定的java.util.Date在今天之后?。

    如果是这样的话,不要为决定一天中的最后一刻而烦恼;这是不可行的,因为分数秒。最好只关注日期,而不关注时间。您想知道给定时刻的日期是否在当前时刻的日期之后。时区在这里至关重要。

    ZoneId z = ZoneId.of( “America/Montreal” );  // Time zone determines date.
    Boolean givenMomentIsAfterToday = myUtilDate.toInstant().atZone( z ).toLocalDate().isAfter( LocalDate.now( z ) );
    

    细节

    首先,转换给定的 java.util.Date Instant . 查找添加到旧类中的新转换方法,以便与java.time类型进行转换。

    瞬间

    这个 Instant UTC 决议 nanoseconds .

    Instant instant = myUtilDate.toInstant();
    

    LocalDate

    这个 LocalDate

    时区是决定日期的关键。在任何一个特定的时刻,世界各地的日期因地区而异。例如,在法国巴黎,午夜过后几分钟是新的一天,而在魁北克山,昨天仍然是新的一天。

    ZoneId z = ZoneId.of( “America/Montreal” );
    LocalDate today = LocalDate.now( z );
    

    ZonedDateTime

    ZonedDateTime zdt = instant.atZone( z );
    

    只询问日期值,a 本地日期 .

    LocalDate ldt = zdt.toLocalDate();
    

    本地日期 物体。

    Boolean givenMomentIsAfterToday = ldt.isAfter( today );
    

    这个 java.time 日期类型 .Calendar ,& java.text.SimpleDateFormat .

    Joda-Time 项目,正在进行中 maintenance mode

    Oracle Tutorial

    java.time的大部分功能都被移植到Java6&中;7英寸 ThreeTen-Backport Android 在里面 ThreeTenABP (见 How to use… ).

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

    推荐文章