How to obtain the start time and end time of a day?

前端 未结 14 819
心在旅途
心在旅途 2020-11-27 10:23

How to obtain the start time and end time of a day?

code like this is not accurate:

 private Date getStartOfDay(Date date) {
    Calendar calendar =          


        
相关标签:
14条回答
  • 2020-11-27 10:25

    in getEndOfDay, you can add:

    calendar.set(Calendar.MILLISECOND, 999);
    

    Although mathematically speaking, you can't specify the end of a day other than by saying it's "before the beginning of the next day".

    So instead of saying, if(date >= getStartOfDay(today) && date <= getEndOfDay(today)), you should say: if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow)). That is a much more solid definition (and you don't have to worry about millisecond precision).

    0 讨论(0)
  • 2020-11-27 10:27

    For java 8 the following single line statements are working. In this example I use UTC timezone. Please consider to change TimeZone that you currently used.

    System.out.println(new Date());
    
    final LocalDateTime endOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
    final Date          endOfDayAsDate = Date.from(endOfDay.toInstant(ZoneOffset.UTC));
    
    System.out.println(endOfDayAsDate);
    
    final LocalDateTime startOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
    final Date          startOfDayAsDate = Date.from(startOfDay.toInstant(ZoneOffset.UTC));
    
    System.out.println(startOfDayAsDate);
    

    If no time difference with output. Try: ZoneOffset.ofHours(0)

    0 讨论(0)
  • 2020-11-27 10:28

    I had several inconveniences with all the solutions because I needed the type of Instant variable and the Time Zone always interfered changing everything, then combining solutions I saw that this is a good option.

            LocalDate today = LocalDate.now();
            Instant startDate = Instant.parse(today.toString()+"T00:00:00Z");
            Instant endDate = Instant.parse(today.toString()+"T23:59:59Z");
    

    and we have as a result

            startDate = 2020-01-30T00:00:00Z
            endDate = 2020-01-30T23:59:59Z
    

    I hope it helps you

    0 讨论(0)
  • 2020-11-27 10:30

    Another one solution which does not depend on any framework is:

    static public Date getStartOfADay(Date day) {
        final long oneDayInMillis = 24 * 60 * 60 * 1000;
        return new Date(day.getTime() / oneDayInMillis * oneDayInMillis);
    }
    
    static public Date getEndOfADay(Date day) {
        final long oneDayInMillis = 24 * 60 * 60 * 1000;
        return new Date((day.getTime() / oneDayInMillis + 1) * oneDayInMillis - 1);
    }
    

    Note that it returns UTC based time

    0 讨论(0)
  • 2020-11-27 10:30

    I know it's a bit late, but in case of Java 8, if you are using OffsetDateTime (which offers a lot of advantages, such as TimeZone, Nanoseconds, etc.), you can use the following code:

    OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
    // output: 2019-01-10T23:59:59.999999999Z
    
    0 讨论(0)
  • 2020-11-27 10:34

    I tried this code and it works well!

    final ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
    final ZonedDateTime startofDay =
        now.toLocalDate().atStartOfDay(ZoneOffset.UTC);
    final ZonedDateTime endOfDay =
        now.toLocalDate().atTime(LocalTime.MAX).atZone(ZoneOffset.UTC);
    
    0 讨论(0)
提交回复
热议问题