gpt4 book ai didi

elixir - 如何获取当前日期和 Ecto.Date 实例的年差

转载 作者:行者123 更新时间:2023-12-02 09:01:54 25 4
gpt4 key购买 nike

假设我有一个 Person 模型,每个人都有一个设置为 Ecto.Date 列的生日字段。

因此,如果我从数据库中检索代表此模型实例的记录,那么从他的 birthday 列中获取此人年龄的最佳方法是什么?

最佳答案

不确定“最佳方式”,但这是一种方式:

defmodule AgeCalc do
@spec age(Ecto.Date.t, atom|{integer, integer, integer}) :: integer
def age(%Ecto.Date{day: d, month: m, year: y}, as_of \\ :now) do
do_age({y, m, d}, as_of)
end

###########
# Internals
###########
@doc false
def do_age(birthday, :now) do
{today, _time} = :calendar.now_to_datetime(:erlang.now)
calc_diff(birthday, today)
end
def do_age(birthday, date), do: calc_diff(birthday, date)

@doc false
def calc_diff({y1, m1, d1}, {y2, m2, d2}) when m2 > m1 or (m2 == m1 and d2 >= d1) do
y2 - y1
end
def calc_diff({y1,_,_}, {y2,_,_}), do: (y2 - y1) - 1
end

用法如下:(今天是 2015 年 9 月 27 日)

iex(1)> AgeCalc.age(%Ecto.Date{day: 27, month: 9, year: 2000})
15
iex(2)> AgeCalc.age(%Ecto.Date{day: 28, month: 9, year: 2000})
14

或者,针对今天以外的其他时间进行手动计算:

iex(3)> AgeCalc.age(%Ecto.Date{day: 28, month: 9, year: 2000}, {2034, 12, 25})
34

关于elixir - 如何获取当前日期和 Ecto.Date 实例的年差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com