Подтвердить что ты не робот

Дата Java (0) не является 1/1/1970

Я ожидал, что это напечатает 1970-01-01-00: 00: 00, но печатает 1970-12-31-19: 00: 00

Что я неправильно интерпретирую, как рассчитывается дата? Это один год. Я запускаю это на Windows 7 с JDK 1.6

System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0)));
4b9b3361

Ответ 1

Что я неправильно интерпретирую, как рассчитывается дата?

new Date(0) - 1 января 1970 г. в UTC. Ваш часовой пояс не UTC.

Это на год.

Нет, нет. Печатное значение находится всего на 5 часов. Позвольте мне угадать - вы где-то в в восточной части США?

Ответ 2

Это не только часовой пояс - это смесь использования часового пояса и использование YYYY, которое указывает на год недели, а не на год (с Java 7). Измените его на YYYY, и вы увидите 1969 год.

docs в течение недельных лет:

Значения, рассчитанные для диапазона WEEK_OF_YEAR, варьируются от 1 до 53. Первая неделя календарного года - это самый ранний семидневный период, начинающийся с getFirstDayOfWeek(), который содержит по крайней мере getMinimalDaysInFirstWeek() дней с этого года. Это зависит от значений getMinimalDaysInFirstWeek(), getFirstDayOfWeek() и дня недели 1 января. Недели с недели 1 года и недели 1 следующего года (эксклюзивные) пронумерованы последовательно от 2 до 52 или 53 (за исключением года (ов), участвующих в переходе Джулиана-Григоря).

Значения getFirstDayOfWeek() и getMinimalDaysInFirstWeek() инициализируются с использованием зависящих от языка ресурсов при построении GregorianCalendar. Определение недели совместимо со стандартом ISO 8601, когда getFirstDayOfWeek() является MONDAY, а getMinimalDaysInFirstWeek() - 4, значения которого используются в локалях, где стандарт является предпочтительным. Эти значения могут быть явно заданы вызовом setFirstDayOfWeek() и setMinimalDaysInFirstWeek().

Недельный год синхронизируется с циклом WEEK_OF_YEAR. Все недели между первой и последней неделями (включительно) имеют одинаковое значение за неделю. Поэтому первый и последний дни недели могут иметь разные значения календарного года.

Таким образом, проблема в том, что последний день "нормального года" 1969 года фактически находится в "недельном году" 1970 года.

Вы должны обязательно использовать YYYY, чтобы избежать путаницы - недельные годы относительно редко полезны и могут легко вызвать путаницу, как мы видели:)

EDIT: Как указано в комментариях, вы уверены, что не используете Java 7? docs для SimpleDateFormat в 1.6 не упоминают об этом... возможно, вы компилируете в версии 1.6, но работаете в 7?

Ответ 3

Чтобы округлить правильные ответы о YYYY vs. YYYY и о обработке часового пояса, вот код, который производит ожидаемый результат:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(sdf.format(new Date(0))); //1970-01-01-00:00:00

Ответ 5

Просто сделайте * 1000L

 System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0) * 1000L));