修改列表列表指定列:将NaiveDateTime转为Erlang日期/Unix时间戳
这个问题其实很好解决,核心就是利用Elixir的模式匹配来精准定位子列表里的第三个元素——毕竟模式匹配就是Elixir处理结构化数据的拿手好戏嘛!
你的思路是对的,用Enum.map/2遍历外层列表,然后每个子列表交给modify_date/1处理。关键在于让modify_date/1只处理第三个元素,其他元素原封不动。
你可以通过模式匹配子列表的结构来实现:在modify_date/1的函数头里,直接把每个子列表拆分成各个元素,只对第三个元素做转换,最后再把所有元素重新组合成新列表。
具体实现示例
假设你要把NaiveDateTime转成Unix时间戳,代码可以这么写:
defmodule DateProcessor do def process_list(list) do Enum.map(list, &modify_date/1) end # 匹配固定5个元素的子列表(和你给出的格式完全对应) defp modify_date([title, description, naive_dt, comment, user]) do # 把NaiveDateTime转成Unix时间戳 converted_timestamp = NaiveDateTime.to_unix(naive_dt) # 重新组合列表,其他元素保持不变 [title, description, converted_timestamp, comment, user] end # 如果你的子列表后面可能有更多元素,用这个更通用的版本: # defp modify_date([first_item, second_item, naive_dt | rest_items]) do # converted_timestamp = NaiveDateTime.to_unix(naive_dt) # [first_item, second_item, converted_timestamp | rest_items] # end end
如果要转成Erlang日期格式(即{{year, month, day}, {hour, minute, second}}元组),只需要把转换函数换成NaiveDateTime.to_erl/1:
converted_erl_date = NaiveDateTime.to_erl(naive_dt)
调用示例
original_list = [ ["First Title", "First Description", ~N[2018-01-01 23:00:07], "First Comment", "UserA"], ["Second Title", "Second Description", ~N[2018-03-02 12:10:18], "Second Comment", "UserB"] ] new_list = DateProcessor.process_list(original_list)
这样处理后,new_list里的第三个元素就全部变成你想要的格式,其他元素完全和原来一致。核心逻辑就是:通过模式匹配精准抓取第三个元素,处理后再把所有元素拼接回去——既简洁又安全,不会误改其他位置的内容。
内容的提问来源于stack exchange,提问作者ontanj
相关产品推荐
相关产品推荐

