2016-07-27 6 views
-1
GregorianCalendar test= new GregorianCalendar(); 
BigDecimal coef=new BigDecimal(-2113480800); 
test.setGregorianChange(new Date(Long.MIN_VALUE)); 
test.set(Calendar.DAY_OF_MONTH, 31); 
test.set(Calendar.MONTH, 11); 
test.set(Calendar.YEAR, 1600); 
test.add(Calendar.DAY_OF_MONTH,-583657); 
System.out.println((test.getTime())); 

// I should get Jan 1 0003 but i get 03 jan 0003 OFFSET of 2 
+1

Почему вы создали «BigDecimal», который затем игнорируете? –

ответ

1

календарь вы используете это хорошо - вам просто нужно помнить, что Dateтолько хранит момент времени. Он не запоминает календарь, часовой пояс или текстовый формат.

Значение Date у вас есть правильно - у него есть миллиметровка эпохи -62072462953058, что соответствует 0003-01-01T17: 10: 46Z (по крайней мере для меня - зависит от времени, в которое вы запускаете код) в системе, которая не использует григорианское изменение.

Однако Date.toString() форматов, что существует был Грегорианское изменение, которое привело к двухдневному офсету.

Вы можете увидеть это с помощью Java-8 в Instant вместо:

import java.time.*; 
import java.util.*; 

public class Test { 
    public static void main (String args[]) { 
     GregorianCalendar test = new GregorianCalendar(); 
     test.setGregorianChange(new Date(Long.MIN_VALUE)); 
     test.set(Calendar.DAY_OF_MONTH, 31); 
     test.set(Calendar.MONTH, 11); 
     test.set(Calendar.YEAR, 1600); 
     test.add(Calendar.DAY_OF_MONTH,-583657); 
     Date date = test.getTime(); 
     Instant instant = Instant.ofEpochMilli(date.getTime()); 
     System.out.println(date); 
     System.out.println(instant); 
    } 
} 

Output (на данный момент, в Лондоне):

Wed Jan 03 17:15:26 GMT 3 
0003-01-01T17:15:26.913Z 

Эти два значения представляют собой один и тот же момент времени, но преобразование Instant в строку не выполняет юлианский/григорианский переход, тогда как Date делает.

+0

то, что я хотел бы сделать, это добавить определенное время из формата ANSI/UNIXTIMESTAMP в формат ISO с учетом их происхождения. дата ввода, которую я принимаю, преобразуется в UNIXTIMESTAMP/ANSI, и я должен преобразовать ее обратно в ту же дату. TimeZone и currentTime можно игнорировать. Мне просто нужно добавить и вычесть время в секундах или днях на какой-то ПРОИСХОЖДЕНИЕ. – 1234jkl

+0

Я не совсем уверен, что вы подразумеваете под форматом «ANSI/UNIXTIMESTAMP» - или как это относится к проблеме, которую вы показали. Я предлагаю вам задать новый вопрос, демонстрирующий это. –

+0

То, что я просто пытался сделать выше, это то, что я хотел добавить -583657 дней к началу координат 1600/12/31, формат времени, который считает 00:00:00 1 января 1601 года как день 1. Итак, -583657 означает дату после добавления -583657days в исходное состояние выше. Но, используя, GeorgianCalendar, я получаю 3 января, 0003 00:00:00. Но фактическая дата - 1 января 0003 00:00:00. Григорианский календарь в java - это гибрид с датой Джулиана, и я получаю определенные смещения, вычитая количество дней, даже если я устанавливаю setGregorianChange(), как указано выше, в соответствии с API, чтобы преобразовать в пролептический. Не могли бы вы предложить мне лучший подход? – 1234jkl