从一个时期计算 2 个时期类型?

Calculating 2 period types from one period?

这个问题困扰了我一段时间。 几个月前,我开始了一个项目,但由于这个愚蠢的问题而无法进行。

如果你看到 6 点到 21 点之间的时间线,那是白天。我的问题是我需要分别计算 2 个日期或小时之间的时间。例如。假设开始时间是 5:00pm,结束时间是下午 22 点。我如何计算这 2 次之间分别是白天和晚上的小时数?

String enter = "2017-08-16 15:00:00";
String leave = "2017-08-17 12:00:00";
org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime start = formatter.parseDateTime(enter);
DateTime end = formatter.parseDateTime(leave);
Period period = new Period(start,end);
int hours = period.toStandardHours().getHours();
System.out.println(hours);

你可以试试这个:

LocalDateTime enterDate = LocalDateTime.of(2017, Month.AUGUST, 16, 15, 0); //2017-08-16 15:00:00
LocalDateTime leaveDate = LocalDateTime.of(2017, Month.AUGUST, 17, 12, 0); //2017-08-17 12:00:00

long differnce = enterDate.until(leaveDate, ChronoUnit.HOURS); // 21

您可以使用 Chronounits,具体取决于适合您的单位。

也看看this and this

此解决方案使用 java.time API 而不是 Joda 时间,但如果您认为有必要,您应该能够自己弄清楚如何重写它。

String enter = "2017-08-14 15:00:00";
String leave = "2017-08-17 12:00:00";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime start = LocalDateTime.parse(enter, formatter);
LocalDateTime end = LocalDateTime.parse(leave, formatter);
Duration duration = Duration.between(start, end);

int duringDay = 0;
int duringNight = 0;

// take care of all full days
long days;
if ((days = duration.toHours() / 24L) > 0) {
    duringDay += 15 * days;
    duringNight += 9 * days;
}

// take care of the remainder
for (int i = 1; i <= duration.toHours() % 24; i++) {
    LocalDateTime ldt = start.plusHours(i);
    if (ldt.getHour() <= 6 || ldt.getHour() > 21) {
        duringNight++;
    } else {
        duringDay++;
    }
}

System.out.println("Hours during day: " + duringDay);
System.out.println("Hours during night: " + duringNight);

有了纳秒精度,它变得有点复杂:

String enter = "2017-08-13 15:30:30";
String leave = "2017-08-17 22:00:00";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime start = LocalDateTime.parse(enter, formatter);
LocalDateTime end = LocalDateTime.parse(leave, formatter);

Duration duration = Duration.between(LocalDateTime.of(start.toLocalDate().plusDays(1), LocalTime.of(0, 0)), LocalDateTime.of(end.toLocalDate(), LocalTime.of(0, 0)));

Duration timeDuringDay = Duration.ofDays(0);
Duration timeDuringNight = Duration.ofDays(0);

// take care of all full days
long days;
if ((days = duration.toHours() / 24L) > 0) {
    timeDuringDay = timeDuringDay.plusHours(15 * days);
    timeDuringNight = timeDuringNight.plusHours(9 * days);
}

// take care of the first day
if (start.isBefore(LocalDateTime.of(start.toLocalDate(), LocalTime.of(6, 0)))) {
    timeDuringNight = timeDuringNight.plus(Duration.between(start, LocalDateTime.of(start.toLocalDate(), LocalTime.of(6, 0))));
    timeDuringNight = timeDuringNight.plus(Duration.ofHours(3));
    timeDuringDay = timeDuringDay.plusHours(15);
} else if (start.isAfter(LocalDateTime.of(start.toLocalDate(), LocalTime.of(21, 0)))) {
    timeDuringNight = timeDuringNight.plus(Duration.between(start, LocalDateTime.of(start.toLocalDate().plusDays(1), LocalTime.of(0, 0))));
} else {
    timeDuringDay = timeDuringDay.plus(Duration.between(start, LocalDateTime.of(start.toLocalDate(), LocalTime.of(21, 0))));
    timeDuringNight = timeDuringNight.plusHours(3);
}   

// take care of the last day
if (end.isBefore(LocalDateTime.of(end.toLocalDate(), LocalTime.of(6, 0)))) {
    timeDuringNight = timeDuringNight.plus(Duration.between(LocalDateTime.of(end.toLocalDate(), LocalTime.of(0, 0)), end));
} else if (end.isAfter(LocalDateTime.of(end.toLocalDate(), LocalTime.of(21, 0)))) {
    timeDuringNight = timeDuringNight.plusHours(6);
    timeDuringNight = timeDuringNight.plus(Duration.between(LocalDateTime.of(end.toLocalDate(), LocalTime.of(21, 0)), end));
    timeDuringDay = timeDuringDay.plusHours(15);
} else {
    timeDuringNight = timeDuringNight.plusHours(6);
    timeDuringDay = timeDuringDay.plus(Duration.between(LocalDateTime.of(end.toLocalDate(), LocalTime.of(6, 0)), end));
}

System.out.println("Time during day: " + timeDuringDay);
System.out.println("Time during night: " + timeDuringNight);

这是我为这个项目想要的最简单的代码。

 String enter = "2017-08-16 05:00:00";
    String out = "2017-08-17 15:00:00";
    DateTimeFormatter time_format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //need to format date fore recognition
    LocalDateTime start = LocalDateTime.parse(enter,time_format);
    LocalDateTime finish = LocalDateTime.parse(out,time_format);
    Duration duration = Duration.between(start,finish); // duration between 2 dates

    int duringDay = 0; // storing hours during day
    int duringNight = 0; // storing hours during night

    for (int i=1;i<=duration.toHours();i++){ // from 1 to number of hours between 2 dates

    LocalDateTime ldt = start.plusHours(i); // for every hour in a range give +1 form started time 5am in this example

    if(ldt.getHour()<=6 || ldt.getHour()>21){ // while it's adding check if hour is between 6am and 21

        duringNight++; // if it's not add to duringNight integer

    } else {duringDay++;} // else give it to duringDay integer

    }

    System.out.println("Day:" + duringDay + "\n" + "Night:" + duringNight);