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
setGregorianChange (новая дата (Long.MIN_VALUE)) не преобразует календарь чистого GregorianCalendar
ответ
календарь вы используете это хорошо - вам просто нужно помнить, что 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
делает.
то, что я хотел бы сделать, это добавить определенное время из формата ANSI/UNIXTIMESTAMP в формат ISO с учетом их происхождения. дата ввода, которую я принимаю, преобразуется в UNIXTIMESTAMP/ANSI, и я должен преобразовать ее обратно в ту же дату. TimeZone и currentTime можно игнорировать. Мне просто нужно добавить и вычесть время в секундах или днях на какой-то ПРОИСХОЖДЕНИЕ. – 1234jkl
Я не совсем уверен, что вы подразумеваете под форматом «ANSI/UNIXTIMESTAMP» - или как это относится к проблеме, которую вы показали. Я предлагаю вам задать новый вопрос, демонстрирующий это. –
То, что я просто пытался сделать выше, это то, что я хотел добавить -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
Почему вы создали «BigDecimal», который затем игнорируете? –