Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших
упс, не побачив) зараз додам
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Алгоритми та структури даних, технології → Порівняння мов програмування → Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших
упс, не побачив) зараз додам
упс, не побачив) зараз додам
Дяку:3
З.І: дивно, що C# ніхто не спробував.
Torbins так який варіант для делфі використовувати?
Добавив реалізацію на PHP дивіться у темі
Я б додав ще й цей варіант. Він коротший і простіше читається "не дельфійцями".
дивно, що C# ніхто не спробував
Я уже коло місяця з датами на роботі воюю, тому особисто мені не дивно
Ну тобто з датами в .net все нормально, просто задовбало уже.
Erlang (Erlang/OTP 22 [erts-10.4])
два варіанти --
таймпстам у вигляді integer
таймпстамп у вигляді дата + час
-module(dd).
-compile([export_all, nowarn_export_all]).
% do(1571882864) % timestamp
% do({ {2018, 3, 1}, {5, 21, 51} }) % { {Year, Month, Day}, {Hour, Minute, Second} }
do(T0) when is_integer(T0) ->
T1 = erlang:system_time(second), % second | millisecond | microsecond | nanosecond ...
do2(T1 - T0);
do({{_Year, _Month, _Day},{_Hour, _Minute, _Second}} = T0) ->
T1 = calendar:now_to_datetime(erlang:timestamp()), % { {Year, Month, Day}, {Hour, Minute, Second} }
Z = calendar:time_difference(T0, T1),
do3(Z);
do(_) -> io:format("~ts~n",[<<"Ви щось переплутали!"/utf8>>]).
do2(T) when is_integer(T) andalso T < 0 ->
io:format("~ts~n",[<<"Назад у майбутнє!"/utf8>>]);
do2(T) when T =:= 0 ->
io:format("~ts~n",[<<"Вітання Вам у моменті \"зараз\"!"/utf8>>]);
do2(T) ->
Z = calendar:seconds_to_daystime(T), % {Days, {Hour, Minute, Second}}
do3(Z). % helper function
% here we also can use next functions:
% calendar:gregorian_seconds_to_datetime(Seconds)
% calendar:datetime_to_gregorian_seconds({ {Year, Month, Day}, {Hour, Minute, Second} })
% calendar:time_difference(T1, T2)
do3({Days, {_, _, _}}) when Days < 0 ->
io:format("~ts~n",[<<"Назад у майбутнє!"/utf8>>]);
do3({0, {0, 0, 0}}) ->
io:format("~ts~n",[<<"Вітання Вам у моменті \"зараз\"!"/utf8>>]);
do3({0, {0, 0, Second}}) ->
V = num2word(Second, [<<"секунду"/utf8>>, <<"секунди"/utf8>>, <<"секунд"/utf8>>]),
io:format("~p ~ts ~ts~n",[Second, V, <<"назад"/utf8>>]);
do3({0, {0, Minute, _}}) ->
V = num2word(Minute, [<<"хвилину"/utf8>>, <<"хвилини"/utf8>>, <<"хвилин"/utf8>>]),
io:format("~p ~ts ~ts~n",[Minute, V, <<"назад"/utf8>>]);
do3({0, {Hour, _, _}}) ->
V = num2word(Hour, [<<"годину"/utf8>>, <<"години"/utf8>>, <<"годин"/utf8>>]),
io:format("~p ~ts ~ts~n",[Hour, V, <<"назад"/utf8>>]);
do3({Days, {_Hour, _Minute, _Second}}) when Days < 30 ->
V = num2word(Days, [<<"день"/utf8>>, <<"дні"/utf8>>, <<"днів"/utf8>>]),
io:format("~p ~ts ~ts~n",[Days, V, <<"назад"/utf8>>]);
do3({Days, {_Hour, _Minute, _Second}}) when Days >= 30 andalso Days < 365 ->
M = Days div 30,
V = num2word(M, [<<"місяць"/utf8>>, <<"місяці"/utf8>>, <<"місяців"/utf8>>]),
io:format("~p ~ts ~ts~n",[M, V, <<"назад"/utf8>>]);
%do3({Days, {_Hour, _Minute, _Second}}) when Days >= 365 ->
do3({Days, {_Hour, _Minute, _Second}}) ->
Y = Days div 365,
V = num2word(Y, [<<"рік"/utf8>>, <<"роки"/utf8>>, <<"років"/utf8>>]),
io:format("~p ~ts ~ts~n",[Y, V, <<"назад"/utf8>>]).
% num2word(50, ["рік", "роки", "років"]) % ["хвилину", "хвилини", "хвилин"]
num2word(Num, Words) ->
N0 = Num rem 100,
N = if N0 > 19 -> N0 rem 10; true -> N0 end,
case N of
1 -> lists:nth(1, Words);
2 -> lists:nth(2, Words);
3 -> lists:nth(2, Words);
4 -> lists:nth(2, Words);
_ -> lists:nth(3, Words)
end.
compile && run && out
$ erl
Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Eshell V10.4 (abort with ^G)
1> c(dd).
{ok,dd}
2> dd:do(1572078000).
49 хвилин назад
ok
3> dd:do(1572078000 - 60*60).
1 годину назад
ok
4> dd:do(1572078000 - 60 * 60 * 24).
1 день назад
ok
5> dd:do(1572078000 - 60 * 60 * 24 * 365).
1 рік назад
ok
6> dd:do(1572078000 + 777777).
Назад у майбутнє!
ok
7> dd:do({{2018,12,23},{12,45,32}}).
10 місяців назад
ok
8> dd:do({{2015,12,23},{12,45,32}}).
3 роки назад
ok
9> dd:do({{2019,10,23},{12,45,32}}).
2 дні назад
ok
10> dd:do({{2019,10,26},{12,45,32}}).
Назад у майбутнє!
ok
11> dd:do("test99").
Ви щось переплутали!
ok
Rust:
extern crate chrono; //for UNIX timestamp
use chrono::{Local, TimeZone, Duration, NaiveDateTime};
fn ago(timestamp: i64) -> String {
let now = Local::now();
let datetime = now.timezone().from_local_datetime(
&NaiveDateTime::from_timestamp(timestamp, 0))
.unwrap();
match now - datetime {
duration if duration>Duration::days(365) =>
format!("{} р.",duration.num_days()%365),
duration if duration>Duration::days(30) =>
format!("{} м.",duration.num_days()%30),
duration if duration>Duration::days(1) =>
format!("{} д.",duration.num_days()),
duration if duration>Duration::hours(1) =>
format!("{} г.",duration.num_hours()),
duration if duration>Duration::minutes(1) =>
format!("{} хв.",duration.num_minutes()),
_ => String::from("Щойно!"),
}
}
fn main() {
let now = Local::now();
//taking slightly more
let five_minutes = (now - Duration::minutes(5) ).timestamp();
let two_hours = (now - Duration::hours(2) ).timestamp();
let ten_days = (now - Duration::days(10) ).timestamp();
let three_months = (now - Duration::days(3*31) ).timestamp();
let four_years = (now - Duration::days(4*366)).timestamp();
for &span in &[five_minutes, two_hours, ten_days, three_months, four_years] {
println!("Timestamp: {} Ago: {}", span, ago(span));
}
}
Вивід:
Timestamp: 1572104887 Ago: 5 хв.
Timestamp: 1572097987 Ago: 2 г.
Timestamp: 1571241187 Ago: 10 д.
Timestamp: 1564069987 Ago: 3 м.
Timestamp: 1445615587 Ago: 4 р.
Як завжди - в процесі написання код вийшов утричі довшим, але компілятор не пропустив
Можна уточнити завдання? 29 лютого 2016 7:30 і 28 лютого 2017 8:00 - це 1 рік чи 11 місяців і скількись там днів різниці?
А 30 листопада 7:30 - 31 грудня 8:00 - 1 місяць чи 31 день?
якщо запитання про умови задачі, то у першому пості все пише:
Тобто якщо різниця в часі становить 1 рік 2 місяці 15 годин і 5 хвилин показуємо тільки текст "1р. назад"
Тобто якщо різниця в часі становить 15 годин і 5 хвилин показуємо тільки текст "15г. назад"
якщо запитання про порахувати вашу різницю, то --
1> calendar:time_difference({{2016, 2, 29},{7, 30, 0}},{{2017, 2, 28},{8, 0, 0}}).
{365,{0,30,0}}
2> calendar:time_difference({{2018, 11, 30},{7, 30, 0}},{{2018, 12, 31},{8, 0, 0}}).
{31,{0,30,0}}
рік та 30 хв,
місяць та 30хв
imho
хоча, завершені-неперевершені перфекціоністи можуть заморочитись, та написати функцію перевірки високосного року, та точної кількості днів у кожному місяці
буду чесним (як і завжди) -- мені ліньки (також, як майже завжди)
якщо запитання про порахувати вашу різницю, то --
1> calendar:time_difference({{2016, 2, 29},{7, 30, 0}},{{2017, 2, 28},{8, 0, 0}}). {365,{0,30,0}}
рік та 30 хв,
Гм. Між 2016.2.29 і 2017.2.28 рік? Припустимо. А між 2016.2.1 і 2017.1.31? Теж рік? А між 2017.2.1 і 2018.1.31, зненацька, 12 місяців?
2> calendar:time_difference({{2018, 11, 30},{7, 30, 0}},{{2018, 12, 31},{8, 0, 0}}). {31,{0,30,0}}
місяць та 30хв
А між 2019.2.1 і 2019.3.4 теж 1 місяць? А між 2019.2.1 і 2019.3.3 місяць, виходить, ще не минув?
Ні, я розумію, що дати - то взагалі цікава тема, ми ще часових поясів не торкалися; але саме тому треба уточнювати. Зрештою, скласти ручками різницю з хвилин, годин, днів, місяців та років як механічну різницю відповідних значень - не космічної складності задача, але вже дещо заплутаніша за цю.
Підкажіть, кого проклинати кому дякувати за таку дибільну систему з переведенням на літній/зимовий час, і з часовими поясами ?
Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...
... не втрачати жодної світлої години! ...
Мені цього не зрозуміти. Не втрачати світлої години можна і без переведення годинників.
А про часові пояси :
Ну добре, історично склалось, але ж цивілізація розвивається, можна було визнати, що весь той час ми міряли час не правильно і пофіксити баґ.
Та все дуже просто: треба лише переконати більшість населення однієї з розвинених країн, що треба міняти, причому одразу вказати, міняти на що, а далі саме піде.
І так, числа 60 та 24 тут явно зайві. Але 7 днів тижня, якщо населення авраамічне, доведеться лишити.
І всі авраамічні релігії дружно посилають втрату послідовності тижнів.
Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...
я точно не знаю, та, здається, на нашій території декілька сотень років назад,
а можливо ще й сотню років назад ще остатки зберігались -- якийсь окремий годинник був,
з буквами типу кирилиці замість цифр по циферблату,
17 букв-цифр (не 12),
та пальметкою типу рози вітрів по центру циферблату замість стрілок,
чи просто зірочки з сонцем та місяцем,
щось таке десь зустрічав, хз як це перевірити (позичте хтось машину часу, на вихідних зганяти вперед в минуле )
лол, навіть щось гуглиться
------------------------------
Сьогодні чудовий день — цієї ночі було переведено стрілки на годину назад. Тепер скажіть, скільки часу минуло сьогодні від 2:00 до 5:00? А від 3:00 до 4:00? А від 4:00 до 3:00?
та ви насміхаєтесь!! ))
▼Ось такого б календара для початку, еге?
початок тижня з неділі -- пахне британцями
13 місяців -- пахне трудоголіками
окремий день як окремий місяць, як новорічний день -- пахне тру святом!
є ж такий жарт -- існує лише 2 (два!) справжніх свята -- новий рік, та кожен день!
правда, у такому контексті новорічним днем може бути день народження))
початок тижня з неділі -- пахне британцями
Ягве скептично подивився на це з-під циліндра і сьорбнув чаю.
Мені ось це найбільше подобається: https://en.wikipedia.org/wiki/Symmetry454
Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...
Ну, насправді переведення на літній/зимовий час — лише бліда подоба часової системи з відліком годин від сходу чи заходу сонця. Якщо на широті Києва тривалість дня коливається від 8 до 16 годин, то щоб уставати з сонцем, годинники доведеться переводити не двічі на рік, а разів так 16 мінімум (подібна система використовувалась в епоху Відродження в Нюрнберзі та інших німецьких містах — час виставлявся так, щоб відхилення початку відліку від фізичного сходу сонця коливалося в межах приблизно плюс-мінус чверті години, а захід соця приблизно з такою ж точністю відповідав цілому номеру години; порівняно з попередньою практикою, коли стрілки коректувалися мало не щодня, щоб точно показувати схід, це було значним спрощенням).