Elixir/Phoenix 日期从工作日 + 周数

Posted

技术标签:

【中文标题】Elixir/Phoenix 日期从工作日 + 周数【英文标题】:Elixir/Phoenix date from weekday + weeknumber 【发布时间】:2017-02-07 05:53:47 【问题描述】:

是否可以通过提供周数和工作日来获取日期(日、月、年)?基本上我需要查询本周的星期一。

我检查了 Erlang,有 :erlang.date |> :calendar.day_of_the_week 返回工作日。但是,有没有办法扭转这个功能?提供工作日、周数和年份以获取确切日期?

谢谢

【问题讨论】:

【参考方案1】:

基本上我需要查询本周的星期一。

您可以将日期的 day_of_the_week 与星期一 (1) 的 day_of_the_week 进行比较,然后从日期中减去该天数:

def monday_in_the_week_of(date) do
  from_monday = :calendar.day_of_the_week(date) - 1
  date
  |> :calendar.date_to_gregorian_days
  |> Kernel.-(from_monday)
  |> :calendar.gregorian_days_to_date
end

演示:

defmodule A do
  def monday_in_the_week_of(date) do
    from_monday = :calendar.day_of_the_week(date) - 1
    date
    |> :calendar.date_to_gregorian_days
    |> Kernel.-(from_monday)
    |> :calendar.gregorian_days_to_date
  end
end

for d <- 1..15 do
  date = 2017, 2, d
  IO.inspect date, A.monday_in_the_week_of(date)
end

输出:

2017, 2, 1, 2017, 1, 30
2017, 2, 2, 2017, 1, 30
2017, 2, 3, 2017, 1, 30
2017, 2, 4, 2017, 1, 30
2017, 2, 5, 2017, 1, 30
2017, 2, 6, 2017, 2, 6
2017, 2, 7, 2017, 2, 6
2017, 2, 8, 2017, 2, 6
2017, 2, 9, 2017, 2, 6
2017, 2, 10, 2017, 2, 6
2017, 2, 11, 2017, 2, 6
2017, 2, 12, 2017, 2, 6
2017, 2, 13, 2017, 2, 13
2017, 2, 14, 2017, 2, 13
2017, 2, 15, 2017, 2, 13

【讨论】:

嘿@Dogbert,感谢您的解决方案,现在一切正常!【参考方案2】:

是否可以通过提供周数和工作日来获取日期(日、月、年)?

也许这样的事情会起作用:

@doc """
iex>get_date(1, 1, 2018)
:ok, ~D[2018-01-01]
"""
def get_date(weekday, _week_number, _year)
    when weekday < 1 or weekday > 7,
    do: :error, "invalid weekday: #inspect(weekday)"

def get_date(_weekday, week_number, _year)
    when week_number < 0 or week_number > 51,
    do: :error, "invalid week_number: #inspect(week_number)"

def get_date(weekday, week_number, year) do
  case Date.new(year, 1, 1) do
    :ok, first_day_of_year ->
      Date.add(first_day_of_year, week_number * 7 + weekday - 1)

    :error, error ->
      :error, error
  end
end

【讨论】:

以上是关于Elixir/Phoenix 日期从工作日 + 周数的主要内容,如果未能解决你的问题,请参考以下文章

从 Phoenix / Elixir GET 函数中调用 Typescript 函数

GraphQL Elixir/Phoenix API:Socket 挂起,响应很大

sh Elixir Phoenix Cheatsheet

将 elixir phoenix 应用程序部署到 heroku - 无法添加 buildpack

Phoenix 1.1.4 早午餐问题

Phoenix - 具有多个渲染的控制器