2014-12-16 3 views
-4

Дано:Java: Сравнение дат на одном часовом поясе

SimpleDateFormat sd = new SimpleDateFormat ("yy-MM-dd hh:mm:ss.SSS"); 
sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
Date d = sd.parse("a date similar to now on local computer"); 

если сравнить d.getTime() с new Date().getTime(), значения отличаются более чем на один час. Зачем?

+1

Потому что это не тот же часовой пояс. Один - GMT, другой - нет. Попробуйте 'sd.format (new Date())' –

+0

, как я могу сделать их одним и тем же часовым поясом, не изменяя новую Date(). GetTime()? – Roxana

+1

Изменить системный часовой пояс на GMT? –

ответ

1

Проверьте свои часовые пояса. Вы сравниваете время, которое не в GMT.

1

Вы явно устанавливаете свой SimpleDateFormat для разбора в GMT, что означает, что при анализе текущего времени часов вы получаете момент времени, когда это время произошло, в часовом поясе GMT. Если вы не находитесь в часовом поясе GMT, это не будет «сейчас».

+0

Если я не устанавливаю часовой пояс, я все равно получаю несоответствие более одного часа. – Roxana

+0

Тогда дайте нам более подробную информацию. Каков часовой пояс вашей системы? В какое время вы на самом деле переходите к 'sd.parse'? И каково фактическое время, когда вы это делаете? –

1

Date объекты ничего не знают о часовых поясах - информация о часовом поясе отсутствует в объекте Date. Объект Date представляет собой «абсолютный» момент времени (это временная метка). Это означает, что вы не должны думать о объекте Date как о «дате в определенном часовом поясе» - он не имеет часовой пояс.

Предположим, что из какого-то источника вы получаете String, который содержит дату и время, без явного упоминания в нем часового пояса, например: 2014-12-16 17:30:48.382. Предположим, что вы знаете, что эта дата и время находятся в часовом поясе GMT.

Вы могли бы затем разобрать его на Date объекта с соответствующим SimpleDateFormat объекта:

DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

// Set the timezone of the SimpleDateFormat to GMT, because you know the string 
// should be interpreted as GMT 
fmt.setTimeZone(TimeZone.getTimeZone("GMT")); 

// Parse the String into a Date object 
Date dateTime = fmt.parse("2014-12-16 17:30:48.382"); 

// Date object which is set to "now" 
Date now = new Date(); 

// Compare it to "now" 
if (dateTime.before(now)) { 
    System.out.println("The specified date is in the past"); 
} else if (dateTime.after(now)) { 
    System.out.println("The specified date is in the future"); 
} else { 
    System.out.println("The specified date is now"); 
} 

Если вы хотите напечатать дату в определенном часовом поясе, а затем сделать это путем форматирования с SimpleDateFormat набора к соответствующий часовой пояс.

DateFormat outfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z"); 
outfmt.setTimeZone(TimeZone.getTimeZone("EDT")); 

// Will print dateTime in the EDT timezone 
System.out.println(outfmt.format(dateTime)); 
Смежные вопросы