2013-12-17 73 views
0

我有一些字段的模型。我想从MongoDB中获取字符串字段并获取子字符串。 我在尝试: 我的get_items代码。这只是一条重要的过滤器。字符串:str来自数据库的字符串

get_items('GET', []) -> 
Items = boss_db:find(item, []), 
S = Req:query_param("start"), 
F = Req:query_param("finish"), 
Start = string_to_datetime(S), 
Finish = string_to_datetime(F), 
Fitems = filter(Items, Start, Finish, []), 
{json, [{items, Fitems}]}. 

create_item code。我的日期时间使用我自己的功能。

create_item('POST', []) -> 
Lastname = Req:post_param("lastname"), 
User = hd(boss_db:find(consumer, [{lastname, Lastname}])), 
DateTime = datetime_to_string(calendar:now_to_local_time(erlang:now())), 
Type = Req:post_param("type"), 
IdType = Req:post_param("idtype"), 
Item = item:new(id, User:id(), DateTime, Type, IdType), 
case Item:save() of 
    {ok, SavedItem} -> {json, [{status, "ok"}]}; 
    {error, Reason} -> {json, [{error, Reason}]} 
end. 

我的函数将datetime转换为字符串。

datetime_to_string({{YY, MM, DD}, {Hour, Min, Sec}}) -> 
io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", 
    [YY, MM, DD, Hour, Min, Sec]). 

将字符串转换为日期时间的函数。

string_to_datetime(S) -> 
{YY, _} = string:to_integer(string:substr(S, 1, 4)), 
{MM, _} = string:to_integer(string:substr(S, 6, 2)), 
{DD, _} = string:to_integer(string:substr(S, 9, 2)), 
{Hour, _} = string:to_integer(string:substr(S, 12, 2)), 
{Min, _} = string:to_integer(string:substr(S, 15, 2)), 
{Sec, _} = string:to_integer(string:substr(S, 18, 2)), 
{{YY, MM, DD}, {Hour, Min, Sec}}. 

我的过滤方法。

filter([], Start, Finish, Acc) -> Acc; 
filter([Model|Models], Start, Finish, Acc) -> 
DateTime = string_to_datetime(Model:datetime()), 
{D1, _} = calendar:time_difference(Start, DateTime), 
{D2, _} = calendar:time_difference(DateTime, Finish), 
if 
    D1 >= 0, D2 >= 0 -> filter(Models, Start, Finish, [Model | Acc]); 
    true -> filter(Models, Start, Finish, Acc) 
end. 

和我有错误:

{function_clause, 
    [{string,substr2, 
     [<<"2013-12-17 18:36:42">>,1], 
     [{file,"string.erl"},{line,213}]}, 
    {string,substr,3,[{file,"string.erl"},{line,208}]}, 
    {cb_tracker_main_controller,string_to_datetime,2, 

请帮助我。

回答

1

首先,您可以尝试使用节拍 lib(https://github.com/selectel/tempo)解析和格式化日期。

你的问题怎么样:string:substr与字符串一起使用 - 整数列表。 < <“2013-12-17 18:36:42”>> - 二进制,你需要在处理之前使用binary_to_list函数将其转换为字符串。

0

好了,所以这个错误来自你的函数

string_to_datetime(S) -> 
    {YY, _} = string:to_integer(string:substr(S, 1, 4)), 
    {MM, _} = string:to_integer(string:substr(S, 6, 2)), 
    {DD, _} = string:to_integer(string:substr(S, 9, 2)), 
    {Hour, _} = string:to_integer(string:substr(S, 12, 2)), 
    {Min, _} = string:to_integer(string:substr(S, 15, 2)), 
    {Sec, _} = string:to_integer(string:substr(S, 18, 2)), 
    {{YY, MM, DD}, {Hour, Min, Sec}}. 

但考虑到你的编码功能

datetime_to_string({{YY, MM, DD}, {Hour, Min, Sec}}) -> 
    io_lib:format("~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", 
     [YY, MM, DD, Hour, Min, Sec]). 

人们可以使用模式匹配实现一个解码器(适应它的二进制文件是直接的,而语法尴尬) :

string_to_datetime (S) -> 
    [Y1,Y2,Y3,Y4, $-, M1,M2, $-, D1,D2, $ , H1,H2, $:, N1,N2, $:, S1,S2] = S, 
    { {list_to_integer([Y1,Y2,Y3,Y4]),list_to_integer([M1,M2]),list_to_integer([D1,D2])} 
    , {list_to_integer([H1,H2]),  list_to_integer([N1,N2]),list_to_integer([S1,S2])} }. 

(代码未测试)

相关问题