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

时间:2014-03-29 13:42:16

标签: prolog swi-prolog

如何将当前系统年份作为prolog中的数字。 我找到了这个。 但它把这一年作为一个字符串。

today(Today) :- get_time(X), format_time(atom(Today), '%Y', X).

感谢。

1 个答案:

答案 0 :(得分:8)

正如mbratch在我的回答评论中指出的那样,format_time/3用于显示日期和时间值。如果我只需要数据,则不会使用format_time/3,而是使用stamp_date_time/3date_time_value/3将时间戳转换为您需要的值。可以找到相关谓词的文档here

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

year(Year) :-
    get_time(Stamp),
    stamp_date_time(Stamp, DateTime, local),
    date_time_value(year, DateTime, Year).

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

  • get_time/2给出一个浮点数,表示自Unix Epoch以来经过的时间。
  • stamp_date_time/3根据第三个参数指示的时区将戳记转换为术语date/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).

使用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).

将返回与给定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).