How to get current system year in Prolog as a number
prolog, swi-prolog
Solution
As mbratch notes in the comments to my answer, `format_time/3` is for displaying date and time values. If I just needed the data, I wouldn't use `format_time/3`, but rather `stamp_date_time/3` and `date_time_value/3` to convert the time stamp into the values you need. Documentation on the relevant predicates can be found here.
To get the current year, a predicate like this will suffice:
year(Year) :-
get_time(Stamp),
stamp_date_time(Stamp, DateTime, local),
date_time_value(year, DateTime, Year).
Here is a descriptions of the built-in predicates used:
- `get_time/2` gives a float representing the elapsed time since the Unix Epoch.
`stamp_date_time/3` converts the stamp to a term `date/9`, according to the time-zone indicated by the third argument. When the time-zone argument is `local` it gets the time-zone which your system takes to be local. An example of `date/9`:
date(2014, 3, 29, 8, 8, 59.30211305618286, 21600, 'MDT', true)
`date_time_value/3`: lets you extract values from a `date/9` term (so you don't have to do silly things like `date(Year,_,_,_,_,_,_,_,_)` to get a simple value).
Your question asks for the year, but your example predicate looks like it describes today's date, which would look like this:
today(Today) :-
get_time(Stamp),
stamp_date_time(Stamp, DateTime, local),
date_time_value(date, DateTime, Today).
The with the `date` keyword, `date_time_value/3` will instantiate `Today` to a term `date/3`, holding the year, month, and day: e.g., `date(2014, 3, 29)`.
Really, it's a bit silly that the library requires three statements to get a common date-time value, so if you're handling time and dates often, you might just want to use a general purpose predicate like
get_date_time_value(Key, Value) :-
get_time(Stamp),
stamp_date_time(Stamp, DateTime, local),
date_time_value(Key, DateTime, Value).
Which will return the current numerical value corresponding to the given `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).
Problem
How to get current system year as a number in prolog. I found this. But it gives the year as a string. ``` today(Today) :- get_time(X), format_time(atom(Today), '%Y', X). ``` Thanks.