Работа с датой в прологе - PullRequest
0 голосов
/ 15 апреля 2020

Как создать программу, в которую можно вставить дату, а после добавить несколько дней (предположим, + 20 дней), чтобы получить новую дату?

ПРИМЕР:

?- write a date in this format(YYYY-MM-DD.): 2020-01-15.
The new date is : 2020-02-04

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

Я нашел ниже код:

goes :-
    write('Please enter your birthday [YYYY-MM-DD]'),
    nl,
    read_string(Birthday),
    parse_time(Birthday, Stamp),
    stamp_date_time(Stamp, DateTime, 'UTC'),
    DateTime = date(Year, Month, Day, _, _, _, _, _, _),
    print('Year: '), print(Year), nl,
    print('Month: '), print(Month), nl,
    print('Day: '), print(Day), nl.

read_string(String) :-
    current_input(Input),
    read_line_to_codes(Input, Codes),
    string_codes(String, Codes).

и получить это:

?- goes.
Please enter your birthday [YYYY-MM-DD] |: 2010-07-05.
false.

1 Ответ

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

Все строительные блоки:

?- date_time_stamp(date(2020,4,15,0,0,0,Off,TZ,DST),TimeStamp).
Off = -7200,
TZ = 'CEST',
DST = true,
TimeStamp = 1586901600.0.

?- NDays=20,Next is $TimeStamp+60*60*24*NDays.
NDays = 20,
Next = 1588629600.0,
TimeStamp = 1586901600.0.

?- stamp_date_time($Next,DT,local).
DT = date(2020, 5, 5, 0, 0, 0.0, -7200, 'CEST', true),
Next = 1588629600.0.

Обозначение $TimeStamp - это удобная функция SWI-Prolog в REPL (то есть, интерактивный интерпретатор), которая дает нам последнее значение, которое переменная TimeStamp была привязана.

Ясно, что вам лучше инкапсулировать сложность в вашем собственном аппликативном интерфейсе.

Документация также намекает по-другому, просто добавьте число дней до поля дня структуры date / 9, чтобы получить соответствующую метку времени.

Тогда целое может быть:

goes :-
    write('enter date as `YYYY-MM-DD.`:'),
    read(YYYY-MM-DD),
    D1 is DD+20,
    date_time_stamp(date(YYYY,MM,D1,0,0,0,_,_,_),Stamp),
    stamp_date_time(Stamp,D,local),
    date_time_value(date,D,DV),
    format('result date:~w', [DV]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...