LINUX.ORG.RU

Разница между датами в минутах

 , , ,


0

1

Есть необходимость посчитать разницу между датами в минутах. Проект на Grails, но т.к. Groovy использует Java классы то вопрос будет справедлив и для Java.

Итак необходимо вычесть разницу между датами за вычетом небольшого промежутка:

((Начало - Окончание) - (Начало промежутка - Окончание промежутка)) = минуты

Формат даты - dd.MM.yyyy HH:mm. Для вычитания перевожу даты в миллисекунды, получаю следующий код:

def foo = ((a.time - b.time) - (c.time - d.time))/60000

И все прекрасно считает, но... выявляется баг. При подсчете дат между месяцами, например между 30 апреля 2014 г. и 1 мая 2014 г. появляется один день или 1440 мин, т.е. наверне появляется 31 апреля - которого быть не должно. Более глубокая проверка показала что в расчете все месяцы имеют 31 день, даже февраль.

Где я допустил ошибку? Ведь перевод в миллисекунды дает точное время с 01.01.1970 г. и в этом переводе должны учитываться точное количество дней в году и т.д.

★★

Более глубокая проверка показала что в расчете все месяцы имеют 31 день, даже февраль.

Где я допустил ошибку?

Вероятно при переводе даты в миллисекунды

yoghurt ★★★★★
()

Какое отношение даты могут иметь к разнице в минутах? Если обе даты посчитаны верно, то и разница в минутах будет точной. Если обе даты как-то неправильно считаются (я бы Unix-time использовал на самом деле), то именно в алгоритме подсчёта этих дат (от какой точки?) и надо искать вашу ошбку. А кода, пересчитывающего даты из формата dd.MM.yyyy HH:mm в количество милисекунд (снова, от какой точки то?) вы как раз и не приводите, хотя проблема в нём.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

При подсчете дат между месяцами, например между 30 апреля 2014 г. и 1 мая 2014 г. появляется один день или 1440 мин, т.е. наверне появляется 31 апреля - которого быть не должно.

Не должно. И нет:

scala> val df = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
df: java.text.SimpleDateFormat = java.text.SimpleDateFormat@e863f5a0

scala> val a = df.parse("2014-04-30 23:30:00")
a: java.util.Date = Wed Apr 30 23:30:00 ALMT 2014

scala> val b = df.parse("2014-05-01 00:30:00")
b: java.util.Date = Thu May 01 00:30:00 ALMT 2014

scala> (b.getTime - a.getTime) / 60000
res0: Long = 60

ищи ошибку в другом месте.

Legioner ★★★★★
()
Ответ на: комментарий от Psych218

Для пересчета в миллисекунды я использую встроенные средства языка millis = date.time

Pirr ★★
() автор топика
Ответ на: комментарий от Legioner

Так вот и я думаю, что не должно быть ошибки... может и правда проблема появляется на этапе получения дат. Наверно перепешу все нахрен на JavaScript`e, пусть на стороне клиента эта ересь считается.

Pirr ★★
() автор топика
Ответ на: комментарий от stevejobs

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

Pirr ★★
() автор топика
Ответ на: комментарий от Pirr

потому что стандартное апи настолько кривокосое, что им никому и в голову не придет воспользоваться.

В оракле признали проблему, и в Java8 выпустили новый пакет java.time. Вместо подключения Joda можно апгрейднуться до Java8. Вот описание: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html Вот как перетащить старые даты на новое апи: http://blog.progs.be/542/date-to-java-time

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.