Java.util.Calendar - миллисекунды с 1 января 1970 г. - PullRequest
8 голосов
/ 04 ноября 2008

Программа с последующим выводом. Кто-то, пожалуйста, объясните мне, почему 10 000 000 миллисекунд с 1 января 1970 года - 31 ноября 1969 года. Ну, кто-то, пожалуйста, объясните, что не так с моим предположением, что первый тест должен дать время 10 000 000 миллисекунд с 1 января 1970 года. Числа меньше, чем 10 000 000 производят тот же результат.

public static void main(String[] args) {

    String x = "10000000";
    long l = new Long(x).longValue();
    System.out.println("Long value: " + l);

    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);

    x = "1000000000000";
    l = new Long(x).longValue();
    System.out.println("\nLong value: " + l);

    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);
}

Длинное значение: 10000000

Календарное время в Миллисе: 10000000

Дата в формате ГГГГ-ММ-ДД: 1969-11-31

Длинное значение: 1000000000000

Календарное время в Миллисе: 1000000000000

Дата в формате ГГГГ-ММ-ДД: 2001-8-8

Ответы [ 6 ]

12 голосов
/ 05 ноября 2008

Даты, которые вы печатаете с Calendar, являются локальными для вашего часового пояса, тогда как для UTC определена эпоха полуночи 1970-01-01. Так что, если вы живете в часовом поясе к западу от UTC, тогда ваша дата будет отображаться как 1969-12-31, хотя (в UTC) это все еще 1970-01-01.

6 голосов
/ 05 ноября 2008

Сначала c.get (Calendar.MONTH) возвращает 0 для января, 1 для февраля и т. Д.

Во-вторых, используйте DateFormat для вывода дат.

В-третьих, ваши проблемы являются отличным примером того, насколько неудобен Java Date API. Используйте Joda Time API, если можете. Это сделает вашу жизнь несколько проще.

Вот лучший пример вашего кода, который указывает часовой пояс:

public static void main(String[] args) {

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

    long l = 10000000L;
    System.out.println("Long value: " + l);
    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));

    l = 1000000000000L;
    System.out.println("\nLong value: " + l);
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));
}
5 голосов
/ 05 ноября 2008

Calendar # setTimeInMillis () устанавливает время календаря в миллисекундах после 1 января 1970 года GMT .

Calendar # get () возвращает запрошенное поле, настроенное для часового пояса календаря, который по умолчанию равен локальный часовой пояс вашего компьютера .

Это должно работать так, как вы ожидаете, если вы указали часовой пояс GMT при создании календаря:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
3 голосов
/ 05 ноября 2008

К сожалению, java.util.Date и java.util.Calendar были плохо спроектированы, что привело к такого рода путанице.

1 голос
/ 05 ноября 2008

Ваш часовой пояс, скорее всего, отстает от GMT (например, GMT-5), поэтому 10 000 000 мс с эпохи - это 31 декабря 1969 года в вашем часовом поясе, но, поскольку месяцы начинаются с нуля в java.util.Calendar ваш Календарь-> текст конверсия ошибочна, и вы получите 1969-11-31 вместо ожидаемого 1969-12-31.

0 голосов
/ 05 ноября 2008

Вы можете сами разобраться, изменив свой первый c.setTimeInMillis(l); на c.clear();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...