2014-09-01 4 views
0

Я пытаюсь получить сегодня UNIX метку времени (секунды, прошедшее с 01/01/1970) в 00:00:00 с календарем в Java:Получение сегодня UNIX метку времени с календарем

public long getTodayTimestamp() { 
    Calendar c = Calendar.getInstance(Locale.getDefault()); 
    c.setTimeInMillis(System.currentTimeMillis());  
    c.set( c.get(Calendar.YEAR), 
      c.get(Calendar.MONTH), 
      c.get(Calendar.DAY_OF_MONTH), 
      0, 0, 0 
    ); 
    return c.getTimeInMillis()/1000; 
} 

Проблема в том, что возвращает 1409608800 на сегодня (1 сентября), но когда я пытаюсь преобразовать его с некоторым конвертером (например, http://www.onlineconversion.com/unix_time.htm), я получаю Mon, 01 Sep 2014 22:00:00 GMT, который является полночь 2 сентября по местному времени. В основном метод возвращает метку времени на 24 часа раньше, чем мне нужно.

Где я повредил?

+2

Из-за "проблем"? Почему вы не можете использовать 'Date' или' System'? – chrylis

+0

Из-за проблем мне понадобилось бы полчаса, чтобы объяснить. РЕДАКТИРОВАТЬ: oops, извините, эта часть была оставлена ​​с того момента, когда вопрос был более пристальным. Конечно, я могу использовать Date или что-то еще в методе, но как?И почему это работает лучше, чем календарь в этом случае? – TimSim

+1

Вы можете установить часовой пояс? (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance%28java.util.TimeZone,%20java.util.Locale%29) – Tom

ответ

1

Онлайн-конвертер возвращает дату UTC + 0
Ваши данные в TimeZone +2.
Это означает: 22:00:00 (UTC + 0) - 00:00:00 (UTC + 2) в вашей временной зоне
поэтому, когда я не ошибаюсь (надеюсь, что так), все кажется правильным.

EDIT:
Проблема в вашем случае:
метод getTodayTimestamp() возвращает метку времени в UTC + 0
(getCalendar.getTimeInMillis возвращается в UTC + 0)
Это означает, 00:00: 00 в вашем регионе (UTC + 2) - 22:00:00 в UTC + 0
Это то, что показывает конвертер!

посмотреть здесь:
http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()

+0

Но метод должен возвращать начало текущего дня, а не на следующий день. – TimSim

+0

см. Мой отредактированный ответ – Ben

0

вы можете получить время UniX нелегкий путь :-)

по крайней мере, вам не придется бороться с локалей и т.д.

public class GetUnixTime { 
    public static void main(String[] args) throws IOException, 
      InterruptedException { 
     ProcessBuilder ps = new ProcessBuilder("date"); 
     ps.redirectErrorStream(true); 
     Process pr = ps.start(); 
     StringWriter sw = new StringWriter(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      sw.write(line); 
     } 
     pr.waitFor(); 
     in.close(); 
     sw.flush(); 
     sw.close(); 

     System.out.println(">"+sw.toString()+"<"); //parse this guy 
    } 
} 
+0

вам придется бороться с системными локалями, ваша программа будет вести себя по-разному для некоторых переменных среды и так далее ... – DThought

0

answer by Ben выглядит правильным.

Избегайте j.u.Calendar

Дата-время работы гораздо проще с достойной библиотеки вместо заведомо беспокойного java.util.Date и классов .Calendar. Либо используйте Joda-Time, либо новый пакет java.time в Java 8. Обе эти библиотеки явно и четко обрабатывают часовые пояса.

Joda времени

Пример в Joda-Time 2.4.

DateTime nowParis = DateTime.now(DateTimeZone.forID("Europe/Paris")); 
DateTime nowUtc = nowParis.withZone(DateTimeZone.UTC); 
long millisecondsSinceUnixEpoch = nowParis.getMillis(); // Some result when called on either nowParis or nowUtc. 
long secondsSinceUnixEpoch = (millisecondsSinceUnixEpoch/1000L); 

Вызов toString на этих объектах DateTime, чтобы проверить их ценность.

Или в одной строке.

long secondsSinceUnixEpoch = (DateTime.now().getMillis()/1000L); 

Поскольку мы хотим только секунды с эпохи текущего момента, часовой пояс не имеет значения.

Смежные вопросы