Выполнение расчета даты и времени на Java - PullRequest
3 голосов
/ 01 марта 2012

Я пытаюсь сделать простые вычисления даты / времени, и независимо от того, что я делаю, я путаюсь с тем, что кажется часовыми поясами и т. Д.

Мне нужно добавить (и вычесть) другую дату/ раз вместе, поэтому я подумал, что самый простой способ будет преобразовать их в секунды, выполнить вычисления и затем отформатировать обратно в строку.Но независимо от того, что я делаю, у меня один час - это похоже на часовой пояс / летнее время и т. Д.

Что не так с этим:

 long dateInMillis = 3600000L;

 DateFormat formatter = new SimpleDateFormat("HH:mm");

 Date dt = new Date();
 dt.setTime(dateInMillis);
 System.out.println( formatter.format(dt.getTime()));

Ответ, который я получаю, - 2:00,Даже если я использую:

 long dateInMillis = 1;

Я все равно получаю 1: 00

Помогите, пожалуйста; -)

TIA Martin

Ответы [ 7 ]

2 голосов
/ 01 марта 2012

Я согласен, что использование Joda, вероятно, облегчит жизнь. Однако то, что вы видите, - это эффект чувствительного форматера TimeZone.

Вы можете попробовать добавить:

formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
2 голосов
/ 01 марта 2012

Избавьте себя от головной боли, используйте для этого существующую библиотеку - мне нравится Joda Time себя.

Например, класс DateTime поддерживает различные вычисления (для сложения или вычитания определенных периодов и т. Д.). Если вам нужен пример, опубликуйте точное требование, и я добавлю его в ответ.

0 голосов
/ 28 декабря 2013

Для потомков, вот пример кода с использованием библиотеки Joda-Time 2.3, как упоминалось в других ответах и ​​комментариях.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

long dateTimeInMillis = 3600000L;  // 1,000 * 60 * 60 = 3600000L = 1 hour.

// Time Zone list… http://joda-time.sourceforge.net/timezones.html  (not quite up-to-date, read page for details)
DateTime dateTimeInUtc = new DateTime( dateTimeInMillis, DateTimeZone.UTC );
// Paris happens to be one hour ahead of UTC/GMT.
DateTime dateTimeInParis = dateTimeInUtc.toDateTime( DateTimeZone.forID( "Europe/Paris" ) );

Дамп на консоль…

System.out.println( "dateTimeInUtc: " + dateTimeInUtc );
System.out.println( "dateTimeInParis: " + dateTimeInParis );

При запуске…

dateTimeInUtc: 1970-01-01T01:00:00.000Z
dateTimeInParis: 1970-01-01T02:00:00.000+01:00
0 голосов
/ 01 марта 2012

Когда вы звоните new Date(), создается текущая дата в текущем часовом поясе.Когда вы звоните 'dt.setTime (dateInMillis);'Вы устанавливаете смещение в миллисекундах с 1 января 1970 года в часовом поясе GMT.Позвольте мне объяснить, здесь, в Msk, первый вызов даст мне Thu Mar 01 17:02:22 MSK 2012, второй вызов даст мне смещение на 1 час, таким образом, в Msk это будет исходное смещение (+3) плюс 1, так что это будет Thu Jan 01 04:00:00 MSK 1970,Затем, когда вы звоните formatter.format(? extends Number), он звонит new Date(((Number)obj).longValue()) внутрь, поэтому он возвращает вам дату, которая составляет Thu Jan 01 04:00:00 MSK 1970, и печатает часы и минуты.Итак, вы правы, он печатает время в вашем текущем часовом поясе.

0 голосов
/ 01 марта 2012

По словам людей здесь, вы можете использовать Joda Time для разрешения этих расчетов.Если вы хотите остаться с чистым Java-кодом, вы можете найти класс Calendar для выполнения операций с датами.Вот пример:

Calendar c = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("HH:mm");
Date d = c.getTime();
System.out.println(df.format(d)); //actual hour:minute
c.add(Calendar.HOUR, -4);
d = c.getTime();
System.out.println(df.format(d)); //actual hour:minute minus 4 hours

Тем не менее, я не буду слишком полагаться на этот вид кода.С Joda Time у вас будет меньше проблем.

0 голосов
/ 01 марта 2012

Я также предлагаю использовать каркас, как это предлагается в комментариях.

Тем не менее, Дата основана на миллисекундах после 1 января 1970 года. Таким образом, 3600000L находится всего в одном часе, поэтому 1:00 является правильным.

0 голосов
/ 01 марта 2012

Вы не должны пытаться форматировать длинную дату. Просто используйте:

long dateInMillis = 3600000L;

DateFormat formatter = new SimpleDateFormat("HH:mm");

Date dt = new Date();
dt.setTime(dateInMillis);
System.out.println( formatter.format(dt));

Однако я бы использовал стороннюю библиотеку lib для обработки вычислений времени, таких как JodaTime, как предлагал @Nim, если ваши вычисления в любом случае сложны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...