2015-03-21 4 views
1

Кажется, что Java и JavaScript дают разные результаты для отрицательных значений миллисекунды.Разница между javascript getTime() и Java getTime()

JAVA:

System.out.println(new Date(-12220000000000L)); 
Wed Sep 26 12:33:20 MST 1582 

JavaScript:

console.log(new Date(-12220000000000)); 
Date {Wed Oct 06 1582 12:33:20 GMT-0700 (LMT)} 

Существует разница в 10 день в их выходах. Но для некоторых значений разница составляет менее 10 дней. Я использовал редактор W3C TryIt для тестирования вывода JavaScript. Я точно не знаю, где начинается отклонение. Я здесь что-то не так?

+0

Почему «новая дата» принимает что-то подобное? У вас есть документация, в которой конструктор даты принимает отрицательные числа. – adeneo

+0

Технически документы API Java API говорят, что отрицательные целые числа разрешены. Не знаю об JavaScript api. –

+0

В каком регионе? Я отмечаю, что первое находится в «MST», а второе находится в «LMT» –

ответ

1

Используя Насхорн, вы можете видеть, когда они отклоняются:

> function printDate(x) { System.out.println(new Date(x) + " - " + new java.util.Date(x)); } 

> printDate(-12219292800000) 
Fri Oct 15 1582 00:00:00 GMT+0000 (GMT) - Fri Oct 15 00:00:00 GMT 1582 

> printDate(-12219292800001) 
Thu Oct 14 1582 23:59:59 GMT+0000 (GMT) - Thu Oct 04 23:59:59 GMT 1582 

Это соответствует коммутатору из Julian to Gregorian calendar.

Библиотека дат Java учитывает это изменение, но JavaScript это не так.

+0

Есть ли способ решить эту проблему? Поскольку разница не кажется фиксированной и, по-видимому, уменьшается по мере увеличения абсолютного значения аргумента Date. – jrook

+0

@jrook Вы можете попробовать класс 'GregorianCalendar' в Java вместо' Date'. – fgb

+0

или проверьте Jodatime или Java 8 Дата api – fgb

0

Как java getTime(), так и javascriptgetTime() возвращает много миллисекунд, прошедших с 1 января 1970 года, 00:00:00 GMT. Отрицательный аргумент вычисляет дату в прошлое.

Я нашел bug in jdk. Читая это, похоже, в jdk 7 есть недостаток 10 дней с 5 октября 1582 по 15 октября 1582. Я думаю, что разница в 10 дней от javascriptgetTime() исходит из этой ошибки.

+0

Это не разница 10 дней, это 2 дня: _ «JRE6 прыгает с 5 октября 1582 года на ** 17 октября 1582 года **« _ против _ »JRE7 прыгает с 5 октября 1582 года на 15 октября 1582 года **" _ –

+0

Это разница в 10 дней при сравнении JRE7 с JavaScript. – fgb

+0

@fgb Да, это то, что ОП обнаружил уже. В отчете об ошибке JDK не упоминается JavaScript, но разница в 2 дня между JRE6 и JRE7. –

2

дата по умолчанию для перехода от Julian к Gregorian календарю в GregorianCalendar класса в Java "is October 15, 1582 (Gregorian). Previous to this, dates will be in the Julian calendar."

Следовательно, OP дата Java от 26 сен 1582 является дата Джулиан. Разница между юлианскими и григорианскими датами в 1582 году была 10 days.

Если рассматриваемая реализация JavaScript не относится к юлианскому к григорианскому коммутатору, но работает со григорианскими датами независимо от того, в какой момент мы находимся в ситуации, которую испытывал ОП.

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