DateTimeモジュール で遊んでみたシリーズ⑧ -DateTime.to_time ~ DateTime.utc_now の紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はDateTimeモジュールについて学んだことをまとめます。

# 目次
1.[DateTimeモジュール で遊んでみたシリーズ① -事前準備編](https://qiita.com/Alicesky2127/items/71d6905684f6f0f936c2)
2.[DateTimeモジュール で遊んでみたシリーズ② -DateTime.add ~ DateTime.compare の紹介](https://qiita.com/Alicesky2127/items/971a013f34f0f1fb7c90)
3.[DateTimeモジュール で遊んでみたシリーズ③ -DateTime.convert ~ DateTime.from_gregorian_seconds の紹介](https://qiita.com/Alicesky2127/items/74e646264c7a55ea6f81)
4.[DateTimeモジュール で遊んでみたシリーズ④ -DateTime.from_iso8601 ~ DateTime.from_naive! の紹介](https://qiita.com/Alicesky2127/items/79869efcf8bb5cee9d82)
5.[DateTimeモジュール で遊んでみたシリーズ⑤ -DateTime.from_unix ~ DateTime.new! の紹介](https://qiita.com/Alicesky2127/items/6ce1eb3071880db5dec2)
6.[DateTimeモジュール で遊んでみたシリーズ⑥ -DateTime.now ~ DateTime.shift_zone! の紹介](https://qiita.com/Alicesky2127/items/b706801a887ceb5427ee)
7.[DateTimeモジュール で遊んでみたシリーズ⑦ -DateTime.to_date ~ DateTime.to_string の紹介](https://qiita.com/Alicesky2127/items/a3fcf13bd2577d57b431)
8.DateTimeモジュール で遊んでみたシリーズ⑧ -DateTime.to_time ~ DateTime.utc_now の紹介(本記事)
9.[DateTimeモジュール で遊んでみたシリーズ番外編 -Livebookでtzdata導入](https://qiita.com/Alicesky2127/items/4ad2072cbca04193a3d4)

# 目的 
DateTimeモジュールに含まれる関数を触って機能を理解したい

https://hexdocs.pm/elixir/DateTime.html

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

# 前提
本記事を手元検証するには、前提としてtzdataの導入が必要です。
まだの場合は下記1.または2.で準備をしてください。

1.local環境でtzdataの導入

https://qiita.com/Alicesky2127/items/71d6905684f6f0f936c2

2.Livebookでtzdataの導入

https://qiita.com/Alicesky2127/items/4ad2072cbca04193a3d4


# DateTime.to_timeとは
`DateTime.to_time(datetime)`は`datetime`をTime構造体に変換します。
時刻以外の情報は失われます。

## 例
```diff_elixir:iex
DateTime.to_time(~U[2015-01-23 23:50:07Z])
```
```
~T[23:50:07]
```

タイムゾーンがUTC以外の時も同様
```diff_elixir:iex
dt = DateTime.now!("Asia/Tokyo")
```
```
#DateTime<2024-12-22 16:40:26.608893+09:00 JST Asia/Tokyo>
```

```diff_elixir:iex
DateTime.to_time(dt)
```
```
~T[16:40:26.608893]
```

# DateTime.to_unixとは
`DateTime.to_unix(datetime, unit \\ :second)`は`datetime`を、UNIX時間に変換します。
タイムゾーン情報は失われます（UNIX時間にはタイムゾーン情報が含まれないため）


この関数の逆は`DateTime.from_unix(integer, unit \\ :second, calendar \\ Calendar.ISO)`です。

## 例
```diff_elixir:iex
DateTime.to_unix(~U[2016-05-24 13:26:08Z])
```
```
1464096368
```
タイムゾーンがUTC以外の時も同様
```diff_elixir:iex
dt = DateTime.now!("Asia/Tokyo")
```
```
#DateTime<2024-12-22 16:49:32.938887+09:00 JST Asia/Tokyo>
```

```diff_elixir:iex
DateTime.to_unix(dt)
```
```
1734853772
```


# DateTime.truncateとは
`DateTime.truncate(datetime, precision)`は`datetime`を`presition`の桁で切り捨てます。

## 例
```diff_elixir:iex
dt = %DateTime{year: 2017, month: 11, day: 7, zone_abbr: "CET",
                hour: 11, minute: 45, second: 18, microsecond: {123456, 6},
                utc_offset: 3600, std_offset: 0, time_zone: "Europe/Paris"}
```
```
#DateTime<2017-11-07 11:45:18.123456+01:00 CET Europe/Paris>
```

`presition`が`:microsecond`のとき
```diff_elixir:iex
DateTime.truncate(dt, :microsecond)
```
```
#DateTime<2017-11-07 11:45:18.123456+01:00 CET Europe/Paris>
```

`presition`が`:millisecond`のとき
```diff_elixir:iex
DateTime.truncate(dt, :millisecond)
```
```
#DateTime<2017-11-07 11:45:18.123+01:00 CET Europe/Paris>
```

`presition`が`:second`のとき
```diff_elixir:iex
DateTime.truncate(dt, :second)
```
```
#DateTime<2017-11-07 11:45:18+01:00 CET Europe/Paris>
```



# DateTime.utc_nowとは(utc_now/1)
`DateTime.utc_now(calendar_or_time_unit \\ Calendar.ISO)`は現在の日時をUTCで返します。
`calendar_or_time_unit`で表示する精度を指定してそれより後の桁を切り捨てることも可能です。
タイムゾーンを指定して現在の日時を取得したい場合は`DateTime.now/2`を使用してください。

## 例
引数無しの場合
```diff_elixir:iex
datetime = DateTime.utc_now()
```
```
~U[2024-12-22 13:39:11.183133Z]
```

デフォルトの精度(:microsecond)が適用されます
```diff_elixir:iex
datetime.microsecond
```
```
{183133, 6}
```


`calendar_or_time_unit`が`:native`のとき
```diff_elixir:iex
datetime0 = DateTime.utc_now(:native)
```
```
~U[2024-12-22 13:41:17.348314Z]
```

デフォルトの精度(:microsecond)が適用されます
```diff_elixir:iex
datetime0.microsecond
```
```
{348314, 6}
```


`calendar_or_time_unit`が`:microsecond`のとき
```diff_elixir:iex
datetime1 = DateTime.utc_now(:microsecond)
```
```
~U[2024-12-22 13:45:49.792390Z]
```

デフォルトの精度(:microsecond)が適用されます
```diff_elixir:iex
datetime1.microsecond
```
```
{792390, 6}
```


`calendar_or_time_unit`が`:millisecond`のとき
```diff_elixir:iex
datetime2 = DateTime.utc_now(:millisecond)
```
```
~U[2024-12-22 13:49:52.958Z]
```

小数点以下4桁(:millisecond)で切り捨てます。
```diff_elixir:iex
datetime2.microsecond
```
```
{958000, 3}
```


`calendar_or_time_unit`が`:second`のとき
```diff_elixir:iex
datetime3 = DateTime.utc_now(:second)
```
```
~U[2024-12-22 13:52:10Z]
```

整数桁(:second)で切り捨てます。
```diff_elixir:iex
datetime3.microsecond
```
```
{0, 0}
```



# DateTime.utc_nowとは(utc_now/2)
`DateTime.utc_now(calendar_or_time_unit \\ Calendar.ISO)`は現在の日時をUTCで返します。
`time_unit`と`calender`を明示します。

## 例
`time_unit`が`:native`のとき
```diff_elixir:iex
datetime0 = DateTime.utc_now(:native, Calendar.ISO)
```
```
~U[2024-12-22 14:00:13.320949Z]
```

デフォルトの精度(:microsecond)が適用されます
```diff_elixir:iex
datetime0.microsecond
```
```
{320949, 6}
```


`time_unit`が`:microsecond`のとき
```diff_elixir:iex
datetime1 = DateTime.utc_now(:microsecond, Calendar.ISO)
```
```
~U[2024-12-22 14:08:58.485245Z]
```

デフォルトの精度(:microsecond)が適用されます
```diff_elixir:iex
datetime1.microsecond
```
```
{485245, 6}
```


`time_unit`が`:millisecond`のとき
```diff_elixir:iex
datetime2 = DateTime.utc_now(:millisecond, Calendar.ISO)
```
```
~U[2024-12-22 14:09:47.614Z]
```

小数点以下4桁(:millisecond)で切り捨てます。
```diff_elixir:iex
datetime2.microsecond
```
```
{614000, 3}
```


`time_unit`が`:second`のとき
```diff_elixir:iex
datetime3 = DateTime.utc_now(:second, Calendar.ISO)
```
```
~U[2024-12-22 14:10:40Z]
```

整数桁(:second)で切り捨てます。
```diff_elixir:iex
datetime3.microsecond
```
```
{0, 0}
```





# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！