Как рассчитать время в Java на основе ТОЛЬКО из предоставленного часа - PullRequest
1 голос
/ 27 ноября 2010

Это две части: сначала вычислите дату начала. Затем вычислите прошедшее время. Для второй части я нашел здесь несколько полезных советов: Рассчитать прошедшее время в Java / Groovy

Однако первая часть - это проблема для меня. Вот как это работает: Пользователь указывает, что интервал времени простирается от значения часа (от 00 до 23). У меня нет какого-либо начального объекта даты / времени - просто целое число часов. Из этого мне нужно вычислить дату начала (а затем истекшее время).

Если начальный час больше текущего часа, это был предыдущий день. Однако для того, чтобы получить фактическую дату начала, мне необходимо учитывать границы месяца и года, а также такие вещи, как високосные годы и изменения летнего времени. Конечно, кто-то уже решил такую ​​проблему. (Я считаю, что это может быть довольно сложно.) Есть ли проверенное решение, которое позволит мне вычислить, сколько времени (в секундах) фактически прошло с данного часа дня (с 00 до 24) до настоящего времени? (Время начала всегда принимается за час.)

Ответы [ 3 ]

4 голосов
/ 27 ноября 2010

Во-первых, я бы предложил использовать Joda Time API. На мой взгляд, это лучший API даты и времени для Java.

Далее вам нужно решить точно , что делать в различных угловых случаях. В частности, предположим, что пользователь вводит «1», и вы близки к переходу на летнее время. Возможно, что 1:00 произошло дважды (если время прошло 1:58, 1:59, 1:00, 1:01 из-за перехода назад из летнего времени) или что это не произошло в все (если время прошло 12:58, 12:59, 2:00 из-за перехода вперед в летнее время). Вам нужно решить, что делать в каждой из этих ситуаций, и помнить, что это также означает знание часового пояса.

Как только вы решите это, это не будет слишком сложно. С Joda Time вы можете использовать метод withHourOfDay, чтобы переходить из одного времени в другое, задав один компонент времени, и, кроме того, есть простые API для добавления или вычитания дня, если вам нужно. Затем вы можете очень легко определить время между двумя значениями DateTime - опять же, Joda Time предоставляет все, что вам нужно.

Вот пример, который не пытается ничего сделать с переходами DST, но это хорошая отправная точка:

import org.joda.time.*;

public class Test
{
    public static void main(String[] args)
    {
        // Defaults to current time and time zone
        DateTime now = new DateTime();
        int hour = Integer.parseInt(args[0]);

        DateTime then = now
            .withHourOfDay(hour)
            .withMinuteOfHour(0)
            .withSecondOfMinute(0);
        if (then.isAfter(now))
        {
            then = then.minusDays(1);
        }
        Period period = new Period(then, now, PeriodType.seconds());

        System.out.println("Difference in seconds: " + period.getSeconds());
    }
}
1 голос
/ 27 ноября 2010

Используйте Joda-Time классы.Вы можете сделать что-то вроде этого:

DateTime now = new DateTime();
DateTime start;
int startHour = getStartHour();// user's choice
int nowHour = now.getHourOfDay();
if (nowHour < startHour) {
  start = now.minusHours(24 - startHour + nowHour);
} else {
  start = now.minusHours(nowHour - startHour);
}
1 голос
/ 27 ноября 2010

Скажем, startHour дается пользователем (предположим, это в диапазоне 0-23).Теперь вы можете начать с этого:

import java.util.Calendar;
import static java.util.Calendar.*;
...
Calendar start = Calendar.getInstance();
if (start.get(HOUR_OF_DAY) < startHour) {
start.add(DAY_OF_MONTH, -1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...