Знайомство з Erlang [14]
Erlang та JS: дата&час -
Додаємо до datetime часовий інтервал
та отримуємо нову дату в erlang та js
Допустимо що у нас є завдання --
написати програму, яка до отриманої дати з часом (datetime)
додає часовий інтервал та повертає нову дату з часом.
формат datetime
- "dd.mm.yyyy,hh:mm"
- "yyyy/mm/dd hh:mm"
формат інтервалу
"dd:hh:mm:ss"
Розпочнемо
на js у мене получилась наступна функція
function get_endtime_by_start(start_time, interval){
var start_timestamp = Date.parse(start_time);
if(isNaN(start_timestamp)){
var v0 = start_time.split(',');
var v1 = v0[0].split('.');
start_timestamp = Date.parse( v1[2] + '/' + v1[1] + '/' + v1[0] + ' ' + v0[1] );
console.log(start_time, v0, v1);
}
var interval1 = interval.split(':');
var end_timestamp = start_timestamp + ((Number(interval1[0])*24*60*60 + Number(interval1[1])*60*60 + Number(interval1[2])*60 + Number(interval1[3]))*1000);//millisec (sec * 1000)
var end_time0 = new Date(end_timestamp);
var end_time_month = end_time0.getMonth() + 1;
var end_time_day = end_time0.getDate();
var end_time_hours = end_time0.getHours();
var end_time_minits = end_time0.getMinutes();
if(end_time_month < 10){ end_time_month = '0' + end_time_month; }
if(end_time_day < 10){ end_time_day = '0' + end_time_day; }
if(end_time_hours < 10){ end_time_hours = '0' + end_time_hours; }
if(end_time_minits < 10){ end_time_minits = '0' + end_time_minits; }
return end_time0.getFullYear() + '/' + end_time_month + '/' + end_time_day + ' ' + end_time_hours + ':' + end_time_minits;
}
звичайно, цей код можна оптимізувати і деякі строки викинути --
перша третина коду функції тут для того, щоб показати підтримку формату,
який не підтримує js-функція Date.parse,
іншу частину залишимо такою для наглядності :)
erlang -
1> A = {{2018,1,3},{8,30,40}}.
{{2018,1,3},{8,30,40}}
2> calendar:datetime_to_gregorian_seconds(A).
63682187440
3> A2 = calendar:datetime_to_gregorian_seconds(A) + 3600*24*2 + 3600*6 + 60*3 + 30.
63682382050
4> A3 = calendar:gregorian_seconds_to_datetime(A2).
{{2018,1,5},{14,34,10}}
власне до datetime додали 02:06:03:30 :)
додатково приведу функцію форматування в бінарний iolist для виводу на сторінку сайту
timestamp2binary({{Year,Month,Day},{Hour,Minit,Second}}) ->
[erlang:integer_to_binary(Year), <<"/">>, ?MODULE:make_valid_day(Month), <<"/">>, ?MODULE:make_valid_day(Day), <<" ">>, ?MODULE:make_valid_day(Hour), <<":">>, ?MODULE:make_valid_day(Minit), <<":">>, ?MODULE:make_valid_day(erlang:trunc(Second))];
timestamp2binary(_) -> <<"undefined err !!7">>.
%helper
make_valid_day(Data) when Data < 10 ->
[<<"0">>, erlang:integer_to_binary(Data)];
make_valid_day(Data) ->
erlang:integer_to_binary(Data).
Посилання
https://erlang.org/doc/man/calendar.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
https://www.w3schools.com/jsref/jsref_parse.asp