Вариант использования: Мне нужно получить список задач, которые являются целевыми или просроченными из базы данных.Задание считается выполненным, если задание выполнено в течение 3 дней и просрочено через 3 дня после назначенной даты.
Например:
Если назначена дата:6 сентября, тогда любое задание до конца 9 сентября будет объявлено о цели, но с 10 сентября оно будет просрочено.
Проблема в том, что мы сохраняем назначенную дату как дату и время в UTC в базе данных. Допустим, пользователь находится вCST так для него
- 6 сентября 00:00:00 CST - 6 сентября 05:00:00 UTC
- 6 сентября 19:00:00 CST - 7 сентября 00:00: 00 UTC
- 6 сентября 23:59:59 CST 7 сентября 04:59:59 UTC
Теперь, как вы видите для пользователя, который находится в CST всю его дату для6-е сентября может быть представлено двумя датами в UTC (т.е. 6-е и 7-е сентября)
Итак, когда мы делаем DATEDIFF (day, assign_date, currentdate) <= 3 </strong>, скажем, текущая дата10 сентября,
Когда назначено_ <<6 сентября 19:00:00 CST, который7 сентября 00: 00: 00 UTC), это будет 6-10 -> 4 дня, что правильно, но когда assign_date> (6 сентября 19:00:00 CST, 7 сентября 00:00:00 UTC) и <(6 сентября)23:59:59 CST - 7 сентября 04:59:59 UTC) это будет 7-10-> 3 дня и, следовательно, не будет считаться просроченным, что неправильно.(Что касается пользователя, сегодняшняя дата по-прежнему 6 сентября, и, следовательно, ее следует рассматривать как просроченную)
Кроме того, я могу проверить эту задачу 10 сентября позже, после 10 сентября 19:00:00 CST, которая будет принимать текущую дату как 11 сентября вместо 10 сентября, что снова будет проблемой, которой я все еще могу управлять при отправкеэто из внешнего интерфейса, но assign_date хранится в базе данных как datetime.
Я подумал об использованиисмещение в java для преобразования функции DATEDIFF в функцию DATEADD, которая сначала преобразует assign_date (который является datetime) в требуемый часовой пояс, предоставляя смещение, а затем CAST его до даты, но проблема заключается в том, что смещение может зависеть от того, какой месяц является дневнымЭкономия времени может изменить смещение для UTC.Пример:
package datetime;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class UTCOffset {
public static void main(String args[]) {
Calendar obj= Calendar.getInstance();
obj.setTimeZone(TimeZone.getTimeZone("PST"));
obj.set(2018,11,12);
System.out.println(obj.getTimeZone().getOffset(obj.getTimeInMillis())/3600000); //In November-> DayLight -> Returns -6
Date d = new Date(); Today 9th Sept
System.out.println(obj.getTimeZone().getOffset(d.getTime())/3600000); // Today in September returns -5
}
}
Итак, смещение также отличается в зависимости от даты.
Может ли кто-нибудь указать, как мы можем решить эти проблемы?