У меня есть временные метки из Oracle, хранящиеся в файле CSV с типом данных long. Эта временная метка генерируется с помощью функции Java getTime(), см. https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html
Временная метка выглядит, например, так: 1723207241234. В документации Oracle я нашел, что это миллисекунды с 1 января 1970 года, 00:00:00 по Гринвичу.
Итак, мне нужно проанализировать временную метку, созданную с помощью функции Java в Oracle (получить дату и время из временной метки), и сохранить эти значения в таблицах SAS. Есть ли способ сделать это?
Дата и время SAS указаны в секундах с 1 января 1960 года. Так что, возможно, что-то вроде want=have/1000+('01Jan1970:00:00:00'dt - '01Jan1960:00:00:00'dt );
.
Я немного в замешательстве. Как этот вопрос связан с Java? А как САС? Что именно вам нужно?
Вы указали значение. И указанное вами значение — это достаточно недавняя дата, а не та, к которой вам нужно было добавить десять лет...
Что сказал @g00se. ZonedDateTime.ofInstant(Instant.ofEpochMilli(1723207241234L), ZoneId.systemDefault())
дает 2024-08-09T14:40:41.234+02:00[Europe/Copenhagen]
в моем часовом поясе. Это звучит разумно?
Что дал ваш поиск? Пожалуйста, всегда выполняйте поиск, прежде чем задавать вопрос здесь. В этом случае то, что вы найдете, уже должно привести вас далеко. Самой сложной задачей может стать отказ от старых веб-страниц, использующих Date
, Calendar
и/или — ой! -- SimpleDateFormat
, так как эти занятия полны хлопот и давно устарели.
Файлы CSV не имеют типов данных. Вы имеете в виду, что временная метка хранится в файлах CSV в виде потоков цифр, как в примерах, которые вы показали?
Эта временная метка генерируется с помощью Java-функции getTime(). Ну, конечно, это не самая ранняя точка в цепочке событий, для вызова этого метода должен быть первый ResultSet
. Так что, возможно, вам стоит вызвать вместо этого rs.getObject(columnIndex, java.time.Instant.class)
Итак, мне нужно проанализировать временную метку, сгенерированную с помощью функции Java в Oracle (получить дату и время из временной метки). И, конечно же, Instant
— это дата и время (в формате UTC).
SAS хранит дату и время с секунд, начиная с 1 января 1960 года, 00:00:00 по Гринвичу. Чтобы преобразовать это значение в дату и время SAS, необходимо добавить 10 лет к значению даты и времени Unix в секундах. '01JAN1970:00:00'dt
в SAS конвертируется в 10 лет в секундах.
data want;
time = 1723207241234/1000 + '01JAN1970:00:00'dt;
format time datetime20.;
run;
time
09AUG2024:12:40:41
Общий подход таков:
Instant.ofEpochMilli(1723207241234L);
Тогда это будет зависеть от того, что вы подразумеваете под «датой» и «временем» (например, дата и время, где и как вы хотите их использовать?) Локальными могут бытьZonedDateTime.ofInstant(Instant.ofEpochMilli(1723207241234L), ZoneId.systemDefault());