Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog &引用;strptime“;在SWI序言中_Prolog_Swi Prolog - Fatal编程技术网

Prolog &引用;strptime“;在SWI序言中

Prolog &引用;strptime“;在SWI序言中,prolog,swi-prolog,Prolog,Swi Prolog,如何将atom'2015-12-15T05 PST'转换为时间戳或日期时间 我试过了 及 根据文档,format\u time/3的模式并不能真正帮助您,因为它希望传递所有信息: 格式时间(+Out,+format,+StampOrDateTime) 这意味着您要提供每个参数。您希望看到带有-前缀的内容,这意味着它正在返回某些内容,这似乎意味着parse_time/3,但文档中说: 文本的支持格式如下表所示 然后它继续列出两个选项,rfc_1123和iso_8601,这两个选项都不符合您的格式。

如何将atom
'2015-12-15T05 PST'
转换为时间戳或日期时间

我试过了


根据文档,
format\u time/3
的模式并不能真正帮助您,因为它希望传递所有信息:

格式时间(+Out,+format,+StampOrDateTime)

这意味着您要提供每个参数。您希望看到带有
-
前缀的内容,这意味着它正在返回某些内容,这似乎意味着
parse_time/3
,但文档中说:

文本的支持格式如下表所示

然后它继续列出两个选项,
rfc_1123
iso_8601
,这两个选项都不符合您的格式。这里似乎没有提供格式代码的方法,这让我感到非常困惑,因为这里有一些底层Unix库可以做到这一点

然而,这个问题可以用每个人最喜欢的工具来解决:定分句语法!以下是我的解决方案:

:- use_module(library(dcg/basics)).

myformat(date(Y,M,D,H,_,_,_,TZ,_)) -->
    integer(Y), "-", integer(M), "-", integer(D),
    "T", integer(H), " ", timezone(TZ).

timezone('UTC') --> "UTC".
timezone('UTC') --> "GMT".
timezone(-18000) --> "PST".
timezone(Secs) -->
    [Sign], digit(H0), digit(H1), digit(M0), digit(M1),
    {
     (Sign = 0'+ ; Sign = 0'-),
     number_codes(Hour, [H0,H1]),
     number_codes(Minutes, [M0, M1]),
     (Sign = 0'+
     -> Secs is Hour * 3600 + Minutes * 60
     ;  Secs is -(Hour * 3600 + Minutes * 60))
    }.

my_time_parse(Atom, Date) :-
    atom_codes(Atom, Codes),
    phrase(myformat(Date), Codes).
我相信学习者会找到改进这段代码的方法,但它用您的示例数据为我做到了这一点。不幸的是,您需要枚举时区或找到更好的时区数据源(可能是解析系统时区定义?),但如果您事先知道只需要处理PST,您可以尝试。下面是一个例子:

?- my_time_parse('2015-12-15T05 PST', Date).
Date = date(2015, 12, 15, 5, _G3204, _G3205, _G3206, -18000, _G3208) ;
false.

希望这有帮助

这个问题讨论得太晚了:所需的格式接近iso_8601,采用的格式是
“2015-12-15T05-08”
。要将时区
“PST”
替换为
“-08”
,我们可以使用
append
。代码:

:- set_prolog_flag(double_quotes, chars).

timezone(" PST", "-08").
timezone(" PDT", "-07").
%% etc

convert_time(Date, Stamp) :- 
    timezone(Zone, Delta),
    append(Front, Zone, Date),
    append(Front, Delta, Date2),
    string_chars(Date3, Date2),
    parse_time(Date3, iso_8601, Stamp).

test :-
    convert_time("2015-12-15T05 PST", Stamp),
    writeln('Stamp'=Stamp),
    fail.
有输出

?- test.
Stamp=1450184400.0
false.

非常酷的解决方案。我从你的回答中学到了很多。我只是希望有一个更方便的解决办法:)。我也是……我不完全清楚为什么情况这么糟糕,但一旦你有时间,你就可以使用,这真的很有趣!
:- set_prolog_flag(double_quotes, chars).

timezone(" PST", "-08").
timezone(" PDT", "-07").
%% etc

convert_time(Date, Stamp) :- 
    timezone(Zone, Delta),
    append(Front, Zone, Date),
    append(Front, Delta, Date2),
    string_chars(Date3, Date2),
    parse_time(Date3, iso_8601, Stamp).

test :-
    convert_time("2015-12-15T05 PST", Stamp),
    writeln('Stamp'=Stamp),
    fail.
?- test.
Stamp=1450184400.0
false.