Java: дата и смещение вопроса? - PullRequest
3 голосов
/ 29 марта 2012

У меня есть веб-приложение, и если на стороне клиента (в Великобритании, которая находится в часовом поясе UTC + 0000), я отправляю параметр даты в виде строки примерно так:

date = "2012-03-28 10:00:00 +0000" // this is meant to say "This is the date and time BST which is +0000 offset from UTC"

, но когда я получаюэта строка в моем сервисе Java REST и попытка разобрать ее в объект даты, используя SimpleDateFormater, она предполагает, что я говорю: «это 10:00 UTC и я нахожусь в часовом поясе UTC + 0000», поэтому он хранитэто время 10:00 утра UTC вместо времени 09:00 утра UTC, которое является правильным разговором с 10:00 утра BST (что составляет +0000).

вот мой пример кода Java:

String dateString = "2012-03-28 10:00:00 +0000";
Timestamp timestamp= null;
try{
DateFormat planningDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
Date date = planningDateFormat.parse(dateString);
timestamp = new Timestamp(date.getTime());
System.out.println("Time stamp value is: " + timestamp.getTime());
System.out.println("Date value after parse: " + date);
System.out.println("Time value passed in was: " + dateString);
}
catch(Exception e){}

, который выводит:

$ java TimeTest 
Time stamp value is: 1332917100000
Date value after parse: Wed Mar 28 11:00:00 BST 2012
Time value passed in was: 2012-03-28 10:00:00 +0000

Как обойти эту проблему?

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

это означает, что «это дата и время BST, которое смещено на +0000 от UTC»

Тогда это твоя проблема. BST на час впереди UTC. Так что 11 утра BST это 10 утра UTC, отсюда и ваш выходной. Возможно, вам следует прочитать немного больше о UTC .

Великобритания - это , а не в «часовом поясе UTC + 0000», в «часовом поясе Европа / Лондон», где UTC + 0 зимой и UTC + 1 летом.

(Как говорит Богдан, часовые пояса жесткие, и Joda Time гораздо лучшая библиотека даты / времени, чем встроенная Java * в любом случае ... но это даст тебе тот же ответ ...)

РЕДАКТИРОВАТЬ: Просто чтобы было совершенно ясно, это значение "2012-03-28 10:00:00 +0000" указывает на 10:00 UTC в любой здравомыслящей системе. Это 11 утра BST, так же, как Java показывает вам. Если вы пытаетесь сделать так, чтобы это означало что-то другое, вам следует прекратить это делать, так как вы будете расходиться практически со всеми системами, известными человеку.

1 голос
/ 29 марта 2012

Управление TimeZone - одна из самых сложных задач при создании веб-приложения :). Но есть несколько хороших проектов в Интернете, которые предлагают хорошую поддержку для таких случаев. Одним из них будет Joda Time

http://joda -time.sourceforge.net /

...