Знайомство з Erlang [14]

Erlang та JS: дата&час -
Додаємо до datetime часовий інтервал
та отримуємо нову дату в erlang та js

Допустимо що у нас є завдання --
написати програму, яка до отриманої дати з часом (datetime)
додає часовий інтервал та повертає нову дату з часом.

формат datetime

  1. "dd.mm.yyyy,hh:mm"
  2. "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