as400 RPGLE получить UT C время в формате UNIX эпохи - PullRequest
1 голос
/ 14 апреля 2020

Все еще изучаю RPG / as400. Мне нужно получить текущую дату и время в формате UT C в формате UNIX эпохи. Мне не очень повезло, когда я искал способ преобразования стандартного дд / мм / гггг чч: мм: сс в формат unix. Можно ли вытащить UNIX метки времени из as400?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Всегда существует необходимость в таких вещах, когда вы общаетесь с внешним миром, например, JWT (проверьте, не истек ли токен).

И вы также можете сделать это без C функций:

**FREE

ctl-opt dftactgrp(*no) actgrp(*caller);

dcl-pr sys_getUtcOffset extproc('CEEUTCO');
  offsetHours int(10);
  offsetMinutes int(10);
  offsetSeconds float(8);
  feedback char(12) options(*omit);
end-pr;

dcl-c UNIX_EPOCH_START z'1970-01-01-00.00.00.000000';

main();
*inlr = *on;


dcl-proc main;
  dcl-s uxts int(10);
  dcl-s now timestamp;
  dcl-s offsetHours int(10);
  dcl-s offsetMinutes int(10);
  dcl-s offsetSeconds float(8);

  now = z'2020-04-15-00.00.00.000';
  sys_getUtcOffset(offsetHours : offsetMinutes : offsetSeconds : *omit);

  uxts = %diff(now : UNIX_EPOCH_START : *SECONDS) - offsetSeconds;

  // Output : 1586908800
  dsply %char(uxts);
end-proc;
1 голос
/ 14 апреля 2020

Я действительно подвергаю сомнению необходимость этого ...

Но из ILE RPG вы можете вызывать C функций ... эта, кажется, та, которую вы хотели бы ...
mktime () - конвертировать местное время

Если вы не знакомы с вызовом C функций из ILE RPG, здесь есть хорошая статья и даже рассматривается mktime (). Дополнение к собственной поддержке даты и времени RPG

Обратите внимание, что необходимые прототипы и определения структуры данных можно найти в библиотеке «System Includes», QSYSIN C, в исходном файле ILERPE ( QRPGLESR C) член "время" ... просто

 /include QSYSINC/QRPGSRC,TIME
 dcl-s  myUnixTime like(time_t)
 dcl-ds myTimeDs   likeds(struct_tm)

 //note: fill in myTimeDS here
 myTimeDs.tm_min = 0;
 // and so on...
 myUnixTime = mktime(myTimeDs);

Если библиотека QSYSIN C отсутствует в вашей системе, попросите администратора установить option 13 - System Openness Includes ОС (LICPGM 5770) -ss1)

В крайнем случае, вы можете использовать следующие выдержки ..

 D time_t                        10I 0 template
 D struct_tm...
 D                 DS                  QUALIFIED ALIGN
 D                                     TEMPLATE
  //  int tm_sec;             /* seconds after the minute (0-61)        */
  //  int tm_min;             /* minutes after the hour (0-59)          */
  //  int tm_hour;            /* hours since midnight (0-23)            */
  //  int tm_mday;            /* day of the month (1-31)                */
  //  int tm_mon;             /* months since January (0-11)            */
  //  int tm_year;            /* years since 1900                       */
  //  int tm_wday;            /* days since Sunday (0-6)                */
  //  int tm_yday;            /* days since January 1 (0-365)           */
  //  int tm_isdst;           /* Daylight Saving Time flag              */
 D tm_sec                        10I 0
 D tm_min                        10I 0
 D tm_hour                       10I 0
 D tm_mday                       10I 0
 D tm_mon                        10I 0
 D tm_year                       10I 0
 D tm_wday                       10I 0
 D tm_yday                       10I 0
 D tm_isdst                      10I 0
 D mktime          PR                  LIKE(time_t)
 D                                     EXTPROC('mktime')
 D  time                               LIKEDS(struct_tm)
...