21

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

упс, не побачив) зараз додам ;)

22

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

упс, не побачив) зараз додам ;)

Дяку:3

З.І: дивно, що C# ніхто не спробував.

23

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

Torbins так який варіант для делфі використовувати?
Добавив реалізацію на  PHP дивіться у темі ;)

Я б додав ще й цей варіант. Він коротший і простіше читається "не дельфійцями".

Прихований текст
program DateBetween;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils,
  System.DateUtils;
 
var
  AUnixTime: Int64;
  ADate: TDateTime;
begin
  try
    Read(AUnixTime); // читаємо цифри
    ADate := UnixToDateTime(AUnixTime); // конвертуємо
    WriteLn(DateTimeToStr(ADate)); // напишемо що це за дата
 
    if YearsBetween(Date, ADate) > 0 then // якщо різниця більша за 0 років
      WriteLn(IntToStr(YearsBetween(Date, ADate)) + 'р. назад') // то виводимо в роках
    else if MonthsBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(MonthsBetween(Date, ADate)) + 'м. назад')
    else if DaysBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(DaysBetween(Date, ADate)) + 'д. назад')
    else if HoursBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(HoursBetween(Date, ADate)) + 'г. назад')
    else if MinutesBetween(Date, ADate) > 0 then
      WriteLn(IntToStr(MinutesBetween(Date, ADate)) + 'х. назад');
  except // стандартний блок для виведення помилок
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

24 Востаннє редагувалося truesupport (07.05.2013 02:42:19)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

дивно, що C# ніхто не спробував

Я уже коло місяця з датами на роботі воюю, тому особисто мені не дивно :)

Ну тобто з датами в .net все нормально, просто задовбало уже.

25

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

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

26

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Можна уточнити завдання? 29 лютого 2016 7:30 і 28 лютого 2017 8:00 - це 1 рік чи 11 місяців і скількись там днів різниці?
А 30 листопада 7:30 - 31 грудня 8:00 - 1 місяць чи 31 день?

Подякували: leofun01, 221VOLT2

27

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

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 р.

Як завжди - в процесі написання код вийшов утричі довшим, але компілятор не пропустив :)

Подякували: 221VOLT1

28 Востаннє редагувалося 221VOLT (26.10.2019 21:10:46)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

koala написав:

Можна уточнити завдання? 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

хоча, завершені-неперевершені перфекціоністи можуть заморочитись, та написати функцію перевірки високосного року, та точної кількості днів у кожному місяці
буду чесним (як і завжди) -- мені ліньки :) (також, як майже завжди)

29

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

221VOLT написав:

якщо запитання про порахувати вашу різницю, то --

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 місяців?

221VOLT написав:
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 місяць, виходить, ще не минув?

Ні, я розумію, що дати - то взагалі цікава тема, ми ще часових поясів не торкалися; але саме тому треба уточнювати. Зрештою, скласти ручками різницю з хвилин, годин, днів, місяців та років як механічну різницю відповідних значень - не космічної складності задача, але вже дещо заплутаніша за цю.

Подякували: leofun01, 221VOLT2

30

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Сьогодні чудовий день — цієї ночі було переведено стрілки на годину назад. Тепер скажіть, скільки часу минуло сьогодні від 2:00 до 5:00? А від 3:00 до 4:00? А від 4:00 до 3:00? :)

Подякували: leofun01, koala, dot, 221VOLT4

31

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Підкажіть, кого проклинати кому дякувати за таку дибільну систему з переведенням на літній/зимовий час, і з часовими поясами ?

Подякували: 221VOLT1

32

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...

Подякували: leofun01, 221VOLT2

33

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

koala написав:

... не втрачати жодної світлої години! ...

Мені цього не зрозуміти. Не втрачати світлої години можна і без переведення годинників.

А про часові пояси :
Ну добре, історично склалось, але ж цивілізація розвивається, можна було визнати, що весь той час ми міряли час не правильно і пофіксити баґ.

Подякували: 221VOLT1

34

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Та все дуже просто: треба лише переконати більшість населення однієї з розвинених країн, що треба міняти, причому одразу вказати, міняти на що, а далі саме піде.
І так, числа 60 та 24 тут явно зайві. Але 7 днів тижня, якщо населення авраамічне, доведеться лишити.

Подякували: 221VOLT1

35 Востаннє редагувалося dot (27.10.2019 20:48:59)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

Ось такого б календара для початку, еге?

https://external-preview.redd.it/zChZCzB1YM85KgZ45xkIcAujR3Hi9rFGhhAqR24n8-0.png?auto=webp&amp;s=c7e83c7b738dacf8a4fb9f3ae7a0e7e2f1f897ed

Подякували: /KIT\, leofun01, 221VOLT3

36

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

І всі авраамічні релігії дружно посилають втрату послідовності тижнів.

37 Востаннє редагувалося 221VOLT (27.10.2019 22:32:45)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

koala написав:

Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...

я точно не знаю, та, здається, на нашій території декілька сотень років назад,
а можливо ще й сотню років назад ще остатки зберігались -- якийсь окремий годинник був,
з буквами типу кирилиці замість цифр по циферблату,
17 букв-цифр (не 12),
та пальметкою типу рози вітрів по центру циферблату замість стрілок,
чи просто зірочки з сонцем та місяцем,
щось таке десь зустрічав, хз як це перевірити (позичте хтось машину часу, на вихідних зганяти вперед в минуле :D )

лол, навіть щось гуглиться

Прихований текст

хз, зараз придумали, чи справді колись на Кремлі інший годинник був
https://replace.org.ua/uploads/images/5402/251f64dd78ec4d89ff44e5450648902c.png
https://replace.org.ua/uploads/images/5402/939feb2ce25e6048c08fb16c699164f0.png


------------------------------

P.Y. написав:

Сьогодні чудовий день — цієї ночі було переведено стрілки на годину назад. Тепер скажіть, скільки часу минуло сьогодні від 2:00 до 5:00? А від 3:00 до 4:00? А від 4:00 до 3:00? :)

та ви насміхаєтесь!! ))

Подякували: leofun01, P.Y.2

38 Востаннє редагувалося 221VOLT (27.10.2019 22:47:32)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

dot написав:
Ось такого б календара для початку, еге?

https://external-preview.redd.it/zChZCzB1YM85KgZ45xkIcAujR3Hi9rFGhhAqR24n8-0.png?auto=webp&amp;s=c7e83c7b738dacf8a4fb9f3ae7a0e7e2f1f897ed

початок тижня з неділі -- пахне британцями
13 місяців -- пахне трудоголіками
окремий день як окремий місяць, як новорічний день -- пахне тру святом!
:D є ж такий жарт -- існує лише 2 (два!) справжніх свята -- новий рік, та кожен день!
:D правда, у такому контексті новорічним днем може бути день народження))

39

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

221VOLT написав:

початок тижня з неділі -- пахне британцями

Ягве скептично подивився на це з-під циліндра і сьорбнув чаю.

Мені ось це найбільше подобається: https://en.wikipedia.org/wiki/Symmetry454

40 Востаннє редагувалося P.Y. (28.10.2019 05:34:26)

Re: Обробка дат: PHP & Python & Ruby & С++ & Java та багато інших

koala написав:

Часові пояси - природа, вибачте. Спершу всі встановлювали час за Сонцем (деякі араби досі); збільшення точності та потреба в уніфікації створила пояси. Он у Китаї пекінський час на всю країну; можете спитати уйгурів, що вони про це думають і де вони це мали.
А переведення першими застосували німці під час Першої Світової - все для фронту, все для перемоги, не втрачати жодної світлої години! За ними підтяглися решта Центру (ага, в 1916 в Центру було кому підтягатися) і Антанта. Тільки відбудувалися після війни і почали скасовувати - Велика Депресія. Відійшли від Депресії - Друга Світова. Оговталися після Другої Світової - нафтова криза 70-х, енергію треба економити! От підозрюю, що якщо зараз почати скасовувати, то екологи почнуть вимагати берегти CO2 (чи що там) і знову повернуть...

Ну, насправді переведення на літній/зимовий час — лише бліда подоба часової системи з відліком годин від сходу чи заходу сонця. Якщо на широті Києва тривалість дня коливається від 8 до 16 годин, то щоб уставати з сонцем, годинники доведеться переводити не двічі на рік, а разів так 16 мінімум (подібна система використовувалась в епоху Відродження в Нюрнберзі та інших німецьких містах — час виставлявся так, щоб відхилення початку відліку від фізичного сходу сонця коливалося в межах приблизно плюс-мінус чверті години, а захід соця приблизно з такою ж точністю відповідав цілому номеру години; порівняно з попередньою практикою, коли стрілки коректувалися мало не щодня, щоб точно показувати схід, це було значним спрощенням).

Подякували: 221VOLT, leofun012