Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 14:48
Оценка:
Здравствуйте!

Кто может пояснить такой феномен?

$ date
Птн Фев 27 17:40:35 MSK 2009
$ cat /etc/sysconfig/clock | grep -v ^$ | grep -v ^#
HWCLOCK_SET_AT_HALT=true
HWCLOCK_ADJUST=true
UTC="true"
ZONE=Europe/Moscow
$ cat DateTest.java 
import java.util.Calendar;
public class DateTest {
  public static void main(String[] args) {
        System.out.println(Calendar.getInstance().getTime());
  }
}
$ javac DateTest.java
$ java DateTest
Fri Feb 27 14:40:51 GMT 2009


Хотелось бы видеть то же, что возвращает команда date. Но не помогает и так:

$ cat DateTest.java 
import java.util.Calendar;
import java.util.TimeZone;
public class DateTest {
  public static void main(String[] args) {
        System.out.println(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime());  }
}
$ javac DateTest.java
$ java DateTest
Fri Feb 27 14:44:37 GMT 2009


На машине с UTC="false" все как обычно
Re: Calendar.getInstance() and UTC on Linux
От: C0s Россия  
Дата: 27.02.09 14:56
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>        System.out.println(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime());  }


так надо бы форматировать дату самому, а не полагаться на его toString
Re[2]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 15:04
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, ENP, Вы писали:


C0s>
ENP>>        System.out.println(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime());  }
C0s>


C0s>так надо бы форматировать дату самому, а не полагаться на его toString


$ cat DateTest.java 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
public class DateTest {
  public static void main(String[] args) {
        System.out.println(new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime()));  
  }
}
$ javac DateTest.java
$ java DateTest
27.02.2009 15:02:57
$ date
Птн Фев 27 18:02:59 MSK 2009
Re: Calendar.getInstance() and UTC on Linux
От: mazurkin http://mazurkin.info
Дата: 27.02.09 15:05
Оценка:
ENP wrote:

>
>         System.out.println(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime());  }
>


Вы тут получаете экземпляр java.util.Date который всю информацию о
таймзоне потерял — соответственно выводится в таймзоне по умолчанию.

Вариантов два

1. Установить тайм-зону по умолчанию для всей программы
TimeZone.setDefault()

2. Использовать для вывода DateFormat (DateFormat, SimpleDateFormat)
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Calendar.getInstance() and UTC on Linux
От: mazurkin http://mazurkin.info
Дата: 27.02.09 15:07
Оценка:
mazurkin wrote:

> 2. Использовать для вывода DateFormat (DateFormat, SimpleDateFormat)


... и устанавливать свою нужную тайм-зону в его параметрах.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Calendar.getInstance() and UTC on Linux
От: C0s Россия  
Дата: 27.02.09 15:10
Оценка:
Здравствуйте, ENP, Вы писали:

C0s>>так надо бы форматировать дату самому, а не полагаться на его toString


ENP>        System.out.println(new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow")).getTime()));

ENP>$ java DateTest
ENP>27.02.2009 15:02:57

как бы надо скормить тайм-зону SimpleDateFormat-теру, а то, судя по всему, он не знает, что ты в Москве

ps. я понимаю, что разговор больше о настройках линукса, а не о java, и знал бы — подсказал, а так пока анализом возможных причин занимаемся
Re[3]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 15:24
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>mazurkin wrote:


>> 2. Использовать для вывода DateFormat (DateFormat, SimpleDateFormat)


M>... и устанавливать свою нужную тайм-зону в его параметрах.


$ cat DateTest.java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
public class DateTest {
  public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
        System.out.println(c.getTime());
        SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        f.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
        System.out.println(f.format(c.getTime()));
  }
}
$ javac DateTest.java
$ java DateTest
Fri Feb 27 15:19:32 GMT 2009
27.02.2009 18:19:32


Т.е. Calendar я не могу указать тайм-зону, а для SimpleDateFormat, получается, могу. Все бы ничего, но Calendar.getTime() мне надо сохранять в БД, а переводить его для этого в строку несколько стремно ...
Re[4]: Calendar.getInstance() and UTC on Linux
От: C0s Россия  
Дата: 27.02.09 15:29
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Т.е. Calendar я не могу указать тайм-зону, а для SimpleDateFormat, получается, могу. Все бы ничего, но Calendar.getTime() мне надо сохранять в БД, а переводить его для этого в строку несколько стремно ...


так и сохраняй спокойно как дату, или, как иногда бывает удобнее, как long millis
переводить в строку надо только при выводе на экран
Re[5]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 16:12
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, ENP, Вы писали:


ENP>>Т.е. Calendar я не могу указать тайм-зону, а для SimpleDateFormat, получается, могу. Все бы ничего, но Calendar.getTime() мне надо сохранять в БД, а переводить его для этого в строку несколько стремно ...


C0s>так и сохраняй спокойно как дату, или, как иногда бывает удобнее, как long millis

C0s>переводить в строку надо только при выводе на экран

Так вот и ломал голову, отчего в БД сохраняется не то, пока не соорудил это test case

Да, в постгресе был timestamp without timezone и это вполне устраивало — видимо не понимал глубины проблемы . А Calendar мне он нужен был для операций с датами и временем (ну там увеличить текущую дату/время на час или на месяц с учетом разного количества дней в месяцах и т.д.) — а тут выходит, что все эти операции будут считаться в UTC, а не в локальном времени. Хоть прям переноси эти операции на уровень СУБД
Re[6]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 16:14
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Здравствуйте, C0s, Вы писали:


C0s>>Здравствуйте, ENP, Вы писали:


ENP>>>Т.е. Calendar я не могу указать тайм-зону, а для SimpleDateFormat, получается, могу. Все бы ничего, но Calendar.getTime() мне надо сохранять в БД, а переводить его для этого в строку несколько стремно ...


C0s>>так и сохраняй спокойно как дату, или, как иногда бывает удобнее, как long millis

C0s>>переводить в строку надо только при выводе на экран

ENP>Так вот и ломал голову, отчего в БД сохраняется не то, пока не соорудил это test case


ENP>Да, в постгресе был timestamp without timezone и это вполне устраивало — видимо не понимал глубины проблемы . А Calendar мне он нужен был для операций с датами и временем (ну там увеличить текущую дату/время на час или на месяц с учетом разного количества дней в месяцах и т.д.) — а тут выходит, что все эти операции будут считаться в UTC, а не в локальном времени. Хоть прям переноси эти операции на уровень СУБД


Или хак в виде TimeZone.setDefault() и все-таки timestamp without timezone в СУБД
Re[6]: Calendar.getInstance() and UTC on Linux
От: Blazkowicz Россия  
Дата: 27.02.09 16:14
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Да, в постгресе был timestamp without timezone и это вполне устраивало — видимо не понимал глубины проблемы . А Calendar мне он нужен был для операций с датами и временем (ну там увеличить текущую дату/время на час или на месяц с учетом разного количества дней в месяцах и т.д.) — а тут выходит, что все эти операции будут считаться в UTC, а не в локальном времени. Хоть прям переноси эти операции на уровень СУБД

1) Надо осознать для себя как часовой пояс влияет на время в базе, и на клиентах. Особенно когда клиенты в разных поясах.
2) И вот уже после осознания необходимо аккуратно продумать все операции, те которые должны зависить от часового пояса и те которые не должны.
Re[7]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 16:41
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Или хак в виде TimeZone.setDefault() и все-таки timestamp without timezone в СУБД


А глобально установить тайм-зону все равно не выйдет: как минимум, FreeMarker хочет, что ему ее установили персонально

Гады ... Скажите, куда идти вешать баг. Есть шанс, что в Sun прислушаются?
Оверквотинг удален. Автору строгий выговор.
Re[7]: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 27.02.09 16:42
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, ENP, Вы писали:


ENP>>Да, в постгресе был timestamp without timezone и это вполне устраивало — видимо не понимал глубины проблемы . А Calendar мне он нужен был для операций с датами и временем (ну там увеличить текущую дату/время на час или на месяц с учетом разного количества дней в месяцах и т.д.) — а тут выходит, что все эти операции будут считаться в UTC, а не в локальном времени. Хоть прям переноси эти операции на уровень СУБД

B>1) Надо осознать для себя как часовой пояс влияет на время в базе, и на клиентах. Особенно когда клиенты в разных поясах.
B>2) И вот уже после осознания необходимо аккуратно продумать все операции, те которые должны зависить от часового пояса и те которые не должны.

Дело в том, что клиенты будут в одном часовом поясе. И никакие операции зависеть от него не должны. Но с Calendar и UTC это, похоже, малой кровью невозможно
Re[8]: Calendar.getInstance() and UTC on Linux
От: Blazkowicz Россия  
Дата: 27.02.09 16:45
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Дело в том, что клиенты будут в одном часовом поясе. И никакие операции зависеть от него не должны. Но с Calendar и UTC это, похоже, малой кровью невозможно

А ты представь, что в разных. Это очень необходимо для понимания происходящего. И перестань оверквотить.
Re[8]: Calendar.getInstance() and UTC on Linux
От: Aib https://razborpoletov.com
Дата: 27.02.09 19:27
Оценка:
Здравствуйте, ENP, Вы писали:

ENP>Здравствуйте, ENP, Вы писали:


ENP>>Или хак в виде TimeZone.setDefault() и все-таки timestamp without timezone в СУБД


ENP>А глобально установить тайм-зону все равно не выйдет: как минимум, FreeMarker хочет, что ему ее установили персонально


ENP>Гады ... Скажите, куда идти вешать баг. Есть шанс, что в Sun прислушаются?


http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6456628

В Java for Business нет ничего невозможного.
Re: Calendar.getInstance() and UTC on Linux
От: ENP  
Дата: 01.03.09 13:43
Оценка:
Виноват-таки оказался линукс: после apt-get install glibc-timezones поведение нормализовалось
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.