7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 22

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

Posted at

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

目次

1.DateTimeモジュール で遊んでみたシリーズ① -事前準備編
2.DateTimeモジュール で遊んでみたシリーズ② -DateTime.add ~ DateTime.compare の紹介
3.DateTimeモジュール で遊んでみたシリーズ③ -DateTime.convert ~ DateTime.from_gregorian_seconds の紹介
4.DateTimeモジュール で遊んでみたシリーズ④ -DateTime.from_iso8601 ~ DateTime.from_naive! の紹介
5.DateTimeモジュール で遊んでみたシリーズ⑤ -DateTime.from_unix ~ DateTime.new! の紹介
6.DateTimeモジュール で遊んでみたシリーズ⑥ -DateTime.now ~ DateTime.shift_zone! の紹介
7.DateTimeモジュール で遊んでみたシリーズ⑦ -DateTime.to_date ~ DateTime.to_string の紹介
8.DateTimeモジュール で遊んでみたシリーズ⑧ -DateTime.to_time ~ DateTime.utc_now の紹介(本記事)
9.DateTimeモジュール で遊んでみたシリーズ番外編 -Livebookでtzdata導入

目的

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

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

前提

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

1.local環境でtzdataの導入

2.Livebookでtzdataの導入

DateTime.to_timeとは

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

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

タイムゾーンがUTC以外の時も同様

iex
dt = DateTime.now!("Asia/Tokyo")
#DateTime<2024-12-22 16:40:26.608893+09:00 JST Asia/Tokyo>
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)です。

iex
DateTime.to_unix(~U[2016-05-24 13:26:08Z])
1464096368

タイムゾーンがUTC以外の時も同様

iex
dt = DateTime.now!("Asia/Tokyo")
#DateTime<2024-12-22 16:49:32.938887+09:00 JST Asia/Tokyo>
iex
DateTime.to_unix(dt)
1734853772

DateTime.truncateとは

DateTime.truncate(datetime, precision)datetimepresitionの桁で切り捨てます。

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のとき

iex
DateTime.truncate(dt, :microsecond)
#DateTime<2017-11-07 11:45:18.123456+01:00 CET Europe/Paris>

presition:millisecondのとき

iex
DateTime.truncate(dt, :millisecond)
#DateTime<2017-11-07 11:45:18.123+01:00 CET Europe/Paris>

presition:secondのとき

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を使用してください。

引数無しの場合

iex
datetime = DateTime.utc_now()
~U[2024-12-22 13:39:11.183133Z]

デフォルトの精度(:microsecond)が適用されます

iex
datetime.microsecond
{183133, 6}

calendar_or_time_unit:nativeのとき

iex
datetime0 = DateTime.utc_now(:native)
~U[2024-12-22 13:41:17.348314Z]

デフォルトの精度(:microsecond)が適用されます

iex
datetime0.microsecond
{348314, 6}

calendar_or_time_unit:microsecondのとき

iex
datetime1 = DateTime.utc_now(:microsecond)
~U[2024-12-22 13:45:49.792390Z]

デフォルトの精度(:microsecond)が適用されます

iex
datetime1.microsecond
{792390, 6}

calendar_or_time_unit:millisecondのとき

iex
datetime2 = DateTime.utc_now(:millisecond)
~U[2024-12-22 13:49:52.958Z]

小数点以下4桁(:millisecond)で切り捨てます。

iex
datetime2.microsecond
{958000, 3}

calendar_or_time_unit:secondのとき

iex
datetime3 = DateTime.utc_now(:second)
~U[2024-12-22 13:52:10Z]

整数桁(:second)で切り捨てます。

iex
datetime3.microsecond
{0, 0}

DateTime.utc_nowとは(utc_now/2)

DateTime.utc_now(calendar_or_time_unit \\ Calendar.ISO)は現在の日時をUTCで返します。
time_unitcalenderを明示します。

time_unit:nativeのとき

iex
datetime0 = DateTime.utc_now(:native, Calendar.ISO)
~U[2024-12-22 14:00:13.320949Z]

デフォルトの精度(:microsecond)が適用されます

iex
datetime0.microsecond
{320949, 6}

time_unit:microsecondのとき

iex
datetime1 = DateTime.utc_now(:microsecond, Calendar.ISO)
~U[2024-12-22 14:08:58.485245Z]

デフォルトの精度(:microsecond)が適用されます

iex
datetime1.microsecond
{485245, 6}

time_unit:millisecondのとき

iex
datetime2 = DateTime.utc_now(:millisecond, Calendar.ISO)
~U[2024-12-22 14:09:47.614Z]

小数点以下4桁(:millisecond)で切り捨てます。

iex
datetime2.microsecond
{614000, 3}

time_unit:secondのとき

iex
datetime3 = DateTime.utc_now(:second, Calendar.ISO)
~U[2024-12-22 14:10:40Z]

整数桁(:second)で切り捨てます。

iex
datetime3.microsecond
{0, 0}

~Elixirの国のご案内~

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

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

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

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

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?