C# DateTime в Java

Я пытаюсь преобразовать миллисекунды во время в Java.

когда я делаю это в C#

DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

Console.WriteLine("1406205185123 = " + EpochOrigin.AddMilliseconds(1406205185123));

результат 24/07/2014 12:33:05

когда я делаю то же самое в Java

 Calendar cc = new GregorianCalendar();

cc.setTimeInMillis(1406205185123L);

результат чт 24 июля 13:33:05 BST 2014

Результат Java добавить на 1 час больше, чем C# .

Любое предложение, как я могу это исправить?

3 ответа

Решение

В C# DateTime не хранит информацию о часовом поясе, но имеет Kind свойство, значение которого указывает, основано ли время, представленное этим экземпляром, на местном времени, всемирном координированном времени (UTC) или точной (см. MSDN). Значение по умолчанию DateTime.Kind свойство Unspecified, Таким образом, в вашем коде C#, DateTime структура создана с линией

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);

определенно должен быть создан таким образом:

DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

для использования в качестве контрольного времени для преобразования (начало эпохи - 1 января 1970 г., 00:00 UTC).

Дополнительную информацию можно найти в этом предыдущем вопросе: /questions/18350421/kak-vyi-konvertiruete-vremya-epohi-v-c/18350451#18350451.

Редактировать 1

Быстрое замечание: DateTime в C# как- то известно о часовом поясе (мое местное время - GMT+1)(редактировать: см. комментарии и редактировать 2):

DateTime t = new DateTime(1970,1,1,0,0,0);
Console.WriteLine(t.ToLocalTime());      // 01/01/1970 01:00:00 (GMT+1)
Console.WriteLine(t.ToUniversalTime());  // 31/12/1969 23:00:00 (GMT)

Редактировать 2

Как правильно указано в комментариях, DateTime не знает о часовом поясе в том смысле, что он содержит информацию о часовом поясе. Однако в своем Kind свойство хранит значение, которое указывает, основан ли экземпляр на местном времени или на UTC, как указано в документации:

Свойство DateTime.Kind. Получает значение, указывающее, основано ли время, представленное этим экземпляром, на местном времени, всемирном координированном времени (UTC) или ни на одном. [...]

Свойство Kind позволяет значению DateTime четко отражать всемирное координированное время (UTC) или местное время. Напротив, структура DateTimeOffset может однозначно отражать любое время в любом часовом поясе как единый момент времени.

Как вы можете видеть, результат в Java имеет отметку BST, которая говорит о том, что это британское летнее время. Таким образом, GregorianCalendar учитывает ваш часовой пояс.

DateTime в C# не знает о часовом поясе, поэтому это UTC, потому что эпоха Unix - это UTC, и если вы добавите миллисекунды к времени UTC, вы также получите время UTC.

Спасибо за ваши ответы и ответы. Я узнаю почему:

и C#, и Java знают о часовом поясе.

потому что C# сделал это

DateTime EpochOrigin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
EpochOrigin.AddMilliseconds(1406205185123)

в Java это должно быть

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
long result = cal.getTimeInMillis();
long value = result + 1406205185123;
return new Timestamp(value);
Другие вопросы по тегам