Как вывести дату из unixtime (алгоритм?)?

Что-то интернет совсем не дает ответ на явный вопрос, напрашивающийся сам собой.

Секунды можно взять по модулю 86400 и получить к-во суток, можно взять по модулю (30 дней * сек.\дней) и получить месяцы...

Но как же 28 февраля, 30,31 день в месяце и т.д. и т.п ?
Сейчас именно нужно из unixtime нативно получать год\месяц\день (не используя готовых функций)

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

Может быть я чего то не понимаю, и из Unix времени можно получить человекопонятную дату гораздо проще ?
  • Вопрос задан
  • 17260 просмотров
Решения вопроса 1
@Hocok_B_KapMaHe Автор вопроса
Нет, не проще.
Этим занимаются специализированные библиотеки

Вот что бывает, когда hello world не пишется без 300MB фреймворка.

Просматривая свои старые вопросы, все таки оставлю ответ на свой же вопрос (найдено на зарубежном ресурсе)

Ok, I managed to get something accurate. Dang leap years!

In the steps below I am using a timestamp of 1203161493 which corresponds to a date/time of 2-15-2008 11:31:33. I'm ignoring timezones and whatnot, it isn't necessary for this.

Steps:
1. Unix timestamp / hours in a year to get years from 1970 to timestamp
ex: 1203161493 / 31436000 = 38.152... years since 1970. Ignoring the decimals, thats 38 years + 1970 = 2008.

2. Determine number of leap years from 1970 to year found in step 1 (extra days).
ex: (2008-1969)/4 = 9.75. Again, ignore the decimal, and we have 9 extra days (we ignore this year's leap day until later)

3. Determine the number of days since the epoch.
ex: 1203161493 / 86400 = 13925.480... days since epoch. Ignore the decimals again.

4. Subtract leap days from number of days since epoch.
ex: 13925 - 9 = 13916.

5. Modulo the number above by the number of days in a year to find the days passed in the current year.
ex: 13916 % 365 = 46 days this year.

6. We go through each month and subtract it until the days left are less than the month's total days. If this year is a leap year and your days in this year found in step 5 was greater than 59 (31+28), we would add one.
ex: 46 - 31 days in Jan = 15 days (in 2nd month) = Feb 15.

7. Find the number of seconds in the current day. Subtract the days since epoch found in step 3 from the timestamp.
ex: 1203161493 - (13925 * 86400) = 41493 seconds

8. Figure out how many hours the seconds found in step 6 is.
ex: 41493 / 3600 = 11.5283... hours. Ignore the decimal again.

9. Find the number of minutes left. Subtract the hours you found in the previous step from the seconds in step 6, then divide by 60.
ex: 41493 - (11 * 3600) = 1893
1893 / 60 = 31.55 minutes. Ignore the decimal

10. Find the number of seconds left. Subtract the minutes in step 8 from the seconds in step 8
ex: 1893 - (31 * 60) = 33 seconds.

Put it all together:
Year: 2008
Month: 2
Day: 15
Hour: 11
Minute: 31
Second: 33
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Нет, не проще.
Этим занимаются специализированные библиотеки, в которых прописаны все ньюансы для всех регионов мира.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Ответ написан
Комментировать
Arct
@Arct
6 пункт повторяется 2 раза, искал алгоритм, нашел, начал оформлять в виде кода и завис... Пофиксите по мере возможности.
З.Ы. Спасибо)
Ответ написан
Комментировать
@kerberous
Год рассчитывается не правильно после 5 пункта нужно посчитать его так:

13916 / 365 + 1970
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы