如何在Prolog中获取当前系统年份的数字

Day*_*ker 4 prolog swi-prolog

如何在prolog中获取当前系统年份作为数字.我找到了这个.但它把这一年作为一个字符串.

today(Today) :- get_time(X), format_time(atom(Today), '%Y', X).
Run Code Online (Sandbox Code Playgroud)

谢谢.

Sho*_*hon 8

正如mbratch在我的回答评论中指出的那样,format_time/3用于显示日期和时间值.如果我只是需要的数据,我不会用format_time/3,而是stamp_date_time/3date_time_value/3时间标志转换成你需要的值.有关相关谓词的文档可以在这里找到.

要获得当前年份,这样的谓词就足够了:

year(Year) :-
    get_time(Stamp),
    stamp_date_time(Stamp, DateTime, local),
    date_time_value(year, DateTime, Year).
Run Code Online (Sandbox Code Playgroud)

以下是对使用的内置谓词的描述:

  • get_time/2给出一个表示自Unix Epoch以来经过的时间的浮点数.
  • stamp_date_time/3date/9根据第三个参数指示的时区将戳记转换为术语.当时区参数为时,local它获取您的系统所在的时区是本地的.一个例子date/9:

    date(2014,3,28,8,8,59.30211305618286,21600,'MDT',true)

  • date_time_value/3:允许您从date/9术语中提取值(因此您不必执行愚蠢的操作,例如date(Year,_,_,_,_,_,_,_,_)获取简单的值).

您的问题要求年份,但您的示例谓词看起来像是描述今天的日期,如下所示:

today(Today) :-
    get_time(Stamp),
    stamp_date_time(Stamp, DateTime, local),
    date_time_value(date, DateTime, Today).
Run Code Online (Sandbox Code Playgroud)

使用date关键字,date_time_value/3将实例化为Today一个术语date/3,持有年,月和日:例如,date(2014, 3, 29).

实际上,有些愚蠢的是,库需要三个语句才能获得一个共同的日期时间值,所以如果你经常处理时间和日期,你可能只想使用像它这样的通用谓词

get_date_time_value(Key, Value) :-
    get_time(Stamp),
    stamp_date_time(Stamp, DateTime, local),
    date_time_value(Key, DateTime, Value).
Run Code Online (Sandbox Code Playgroud)

这将返回对应于给定的当前数值Key:

?- get_date_time_value(day, X).
X = 29.

?- get_date_time_value(year, X).
X = 2014.

?- get_date_time_value(date, X).
X = date(2014, 3, 29).
Run Code Online (Sandbox Code Playgroud)