Преобразование даты в день в Java - PullRequest
2 голосов
/ 31 октября 2011

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

 SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd");
 String s1 = sfd.format(dateObj);
 String a1 [] = s1.split("-");
 int year = Integer.parseInt(a1[0].toString());
 int month = Integer.parseInt(a1[1])-1;
 int day = Integer.parseInt((a1[2]));

 Calendar c1 = Calendar.getInstance();
 c1.set(year,month,day);

 days = c1.getTime().getTime()/(24*60*60*1000);

Приведенный выше код работает точно в моей системе, то есть Windows с часовым поясом GMT + 5.30.

Однако тот же код в часовом поясе EST или Pacific добавляет день на 1 к окончательному результату, когда время в системе составляет 20.00.

В чем может быть проблема?

Нужно ли явно устанавливать часовой пояс в коде?

Введенные даты не содержат меток времени. правильно хранить в java.util.Date вместо java.sql.Date?

1 Ответ

3 голосов
/ 31 октября 2011

РЕДАКТИРОВАТЬ: Согласно комментарию Алекса, возможно, что проблемы с запуском вашего кода ослепили меня к вашей реальной цели.

A Date представляет собой мгновение во времени.Это может приходиться на разные даты в зависимости от часового пояса, но как вы хотите, чтобы это повлияло на вещи?Вы хотите количество дней с начала эпохи Unix (всегда UTC) или количество дней с 1 января 1970 года в определенном часовом поясе?Почему вы хотите использовать это «количество дней» вместо представления даты, такой как LocalDate?Какой здесь вариант использования?

РЕДАКТИРОВАТЬ: Если вы просто хотите узнать количество дней со времен Unix, вы можете пропустить большую часть этого:

days = dateObj.getTime() / (24 * 60 * 60 * 1000);

Вы не должныне проходить форматирование вообще, чтобы получить год / месяц / день.Просто создайте Calendar, установите соответствующий часовой пояс, наберите setTime с уже набранным dateObj, а затем очистите часть часа / минуты / секунды календаря.

Однако,Вы должны явно указать, какой часовой пояс вы хотите рассмотреть - Date представляет момент во времени, что будет означать разные даты в разных часовых поясах.

Вам также следует рассмотреть возможность использования Joda Time , которая делает все это проще и имеет определенный тип для дат (LocalDate).Это также позволило бы легко определить количество дней между эпохой Unix и конкретной датой без самостоятельного разделения.

...