перевод Double значения времени( сек) в unix формат

265
07 января 2018, 06:19

Например, вот такая дата со временем: 2017.01.12 22:44:0.9999

То конвертируем это все в секунды: 3600 * 22 + 60 * 44 + 0.9999

И вот секунды представлены в Float значении.

И как мне это перевести в unix?

Answer 1

'Unix time' -- это не вещественное, а целое число. Самый естественный способ получить из вещественного значения целое - это округлить его. Можно, конечно, не округлять, а отбрасывать дробную часть, но при этом будет получаться время, отстающее от действительного в среднем на полсекунды. Округление:

 double doubleTime =  3600 * 22 + 60 * 44 + 0.9999;
 long unixTime = Math.round(doubleTime); 

Другой вопрос, что в Java намного чаще употребляется время в миллисекундах, чем в секундах -- есть множество классов и методов для работы со временем в таком виде, например для преобразования такого времени в строку в нужном формате. Если вы предпочтете использовать такое представление времени, то это можно делать вот так:

 double doubleTimeMs =  (3600 * 22 + 60 * 44 + 0.9999) * 1000; // в миллисекундах
 long javaTime = Math.round(doubleTimeMs); 
 String thatTime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(javaTime);
 System.out.println("That time was " + thatTime);
 long now = System.currentTimeMillis();
 System.out.println("Now is        " 
                    + new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(now);  
Answer 2

Unix timestamp исчисляется с точностью до секунд(миллисекунд) и отсчитывается с полуночи 1 января 1970 года.

Т.е. для 2017.01.12 22:44:0.9999 (считаем, что это Гринвич, чтобы временными зонами не заморачиваться), будет так

Составляющая от годов: (2017 - 1970) * 31536000 = 1482192000 (необходима поправка на високосные года)

Месяц тут не сыграет (и слава богу)

Составляющая от дней: 12 * 86400 = 1036800

Составляющая от часов и минут: 22 * 3600 + 44 * 60 = 81840

Итого: 1484174640 секунд (Это без учета високосных лет и прочих корректировок)

Теперь с секундами. Есть два пути:

1) Если вам нужна временная метка в секундах, то нецелое значение можно округлить Math.round() (или отбросить, например Math.floor())

2) Использовать таймштамп в миллисекундах. Тогда как-то так:

Long timestamp = 1484174640 * 1000 + Math.round(0.9999 * 1000);

Но в целом, это очередное изобретение велосипеда. Для Java есть большое количество библиотек(включая стандартную), которые позволяют корректно работать с датами практически в любых форматах.

READ ALSO
Композиция из java-приложений

Композиция из java-приложений

Доброго времени суток всем! Возникли интересные вопросы, на которые ответить у меня не хватит профессионального опытаПоэтому обращаюсь...

250
apache CollectionUtils.Transformer

apache CollectionUtils.Transformer

Ребят, помогите, не поинмаю что делатьЕсть задача: нужно создать метод который пегоняет коллекцию из одного типа в другой, например: Collection<Integer>...

231
Не получается скачать JSON в android приложение

Не получается скачать JSON в android приложение

На сервере есть https://apiandroidhive

229
Подсчет количества цифр в каждом из целочисленных элементов массива

Подсчет количества цифр в каждом из целочисленных элементов массива

Подскажите, пожалуйста, как подсчитать количество цифр в каждом из целочисленных элементов массива (int)Скажем, массив выглядит так:

258