Сравните календарное время по минутам - PullRequest
0 голосов
/ 20 декабря 2018

Я бы хотел посчитать разницу между «Пн 17:00» и «Вт 5:00» в «минутах». Как этого добиться с помощью Java.Я не совсем понимаю, как использовать календарь, и simpleDateFormat не поддерживает функцию Mon, Tue, Wed и т.д.Любая помощь?

Проблема включает в себя только неделю, поэтому "SUN 00:00" как самое раннее и "SAT 23:59" как самое позднее.

PS учитывая много строк в этом формате, ятакже хотел бы отсортировать их по тому, что происходит первым, и тому, что происходит последним.Потому что я думаю, что их сортировка в первую очередь облегчит задачу (определение разницы).

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Java не имеет типа, который представляет время недели (день недели и время дня).Я предлагаю:

  • Использовать java.time, современный Java-интерфейс даты и времени.
  • Разработать класс для представления вашего времени.
  • Внутренне только в вашем классепредставляйте свое время как конкретную дату и время на какой-то неделе, которую вы решитеЭто даст вам бесплатную сортировку и разницу в минутах.

Ваш класс может выглядеть следующим образом:

/** A time of week like "MON 17:00". In other words a day of week and time of day. */
public class TimeOfWeek implements Comparable<TimeOfWeek> {

    private static DateTimeFormatter dayTimeFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("EEE H:mm")
            .toFormatter(Locale.ENGLISH);
    /** First day of the week used internally for date-times, Sun Dec 28, 1969 */
    private static LocalDate firstDate 
            = LocalDate.EPOCH.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

    /**
     * Internal representation;
     * always within the week of the epoch, Sun Dec 28, 1969 through Sat Jan 3, 1970.
     */
    private LocalDateTime dateTime;

    public TimeOfWeek(String dayTimeString) {
        TemporalAccessor parsed = dayTimeFormatter.parse(dayTimeString);
        DayOfWeek dow = DayOfWeek.from(parsed);
        LocalTime time = LocalTime.from(parsed);
        dateTime = firstDate.with(TemporalAdjusters.nextOrSame(dow)).atTime(time);
        assert ! dateTime.isBefore(firstDate.atStartOfDay()) : dateTime;
        assert dateTime.isBefore(firstDate.plusWeeks(1).atStartOfDay()) : dateTime;
    }

    /** The order is by day of week, Sunday first, then by time of day. */
    @Override
    public int compareTo(TimeOfWeek other) {
        return this.dateTime.compareTo(other.dateTime);
    }

    /** @return The difference in minutes between this and other (signed) */
    int minutesUntil(TimeOfWeek other) {
        return Math.toIntExact(ChronoUnit.MINUTES.between(this.dateTime, other.dateTime));
    }

    @Override
    public String toString() {
        return dateTime.format(dayTimeFormatter);
    }
}

Теперь для сортировки списка TimeOfWeek объектов:

    List<TimeOfWeek> dayTimes = Arrays.asList(new TimeOfWeek("Tue 5:00"),
            new TimeOfWeek("SAT 23:59"),
            new TimeOfWeek("SUN 00:00"),
            new TimeOfWeek("MON 17:00"));
    dayTimes.sort(Comparator.naturalOrder());
    System.out.println(dayTimes);

Вывод:

[Вс 0:00, Пн 17:00, Вт 5:00, Сб 23:59]

Найтипопарные различия между объектами в отсортированном списке:

    for (int i = 1; i < dayTimes.size(); i++) {
        TimeOfWeek start = dayTimes.get(i - 1);
        TimeOfWeek end = dayTimes.get(i);
        System.out.println("Difference between " + start + " and " + end + ": "
                + start.minutesUntil(end) + " minutes");
    }
Difference between Sun 0:00 and Mon 17:00: 2460 minutes
Difference between Mon 17:00 and Tue 5:00: 720 minutes
Difference between Tue 5:00 and Sat 23:59: 6899 minutes

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, какиспользовать java.time.

0 голосов
/ 21 декабря 2018

Если не разрешено использовать SimpleDateFormat, вам лучше использовать Apache lang 3.

import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.time.DateUtils;

public class DateCompare {

    public static void main(String[] args) {
        try {
            final String start = "MON 17:00";
            final String end = "Tue 5:00";
            List<Date> dates = Arrays.asList(DateUtils.parseDate(start, Locale.US, "EEE HH:mm"), DateUtils.parseDate(end, Locale.US, "EEE HH:mm"));
            Collections.sort(dates);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(dates.get(1).getTime() - dates.get(0).getTime()); 
            System.out.println(diffMinutes + " minutes");
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}
0 голосов
/ 20 декабря 2018

Может быть что-то вроде этого

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class DateCompare {

    public static void main(String[] args) {
        try {
            final String start = "Mon 17:00";
            final String end = "Tue 5:00";
            SimpleDateFormat formatter = new SimpleDateFormat("EEE HH:mm", Locale.US);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(formatter.parse(end).getTime() - formatter.parse(start).getTime()); 
            System.out.println(diffMinutes + " minutes");
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}
...