Rubyの時刻と日付のクラスの使用方法
時間は、特定の時点を表すのに役立つRubyのクラスです。
この記事を読むと、Rubyタイムウィザードになるために知っておく必要のあるすべてのことを学ぶことができます!
対象トピック :
- 文字列を時間オブジェクトに変換する方法
- 時間をコンポーネントに分割する方法(日/時間/ミリ秒…)
Date
の使用方法 、DateTime
&Time
Rubyのクラス- 任意の方法で時刻をフォーマットする方法
- 2つの
Time
の違いを見つける方法 オブジェクト
やってみましょう!
ルビータイムクラス
Time
を使用できます 時刻と日付を表すRubyのクラス。
この日付 3つのコンポーネントがあります:
- 日
- 月
- 年
そして時間 :
- 時間
- 分
- 秒
この情報はTime
によって保存されます エポックからの秒数としてのクラス。Unix時間とも呼ばれます。
初期化する方法はいくつかあります Time
オブジェクト:
-
Time.now
を使用して、現在の時刻を表すオブジェクトを取得できます Time
を作成できます Unixタイムスタンプとat
を使用するオブジェクト メソッド- 開始日を
Time.new
に数字で指定できます (形式:年/月/日)
このように :
Time.now # 2018-10-19 15:43:20 +0200 Time.new(2018, 1, 1) # 2018-01-01 00:00:00 +0100 Time.at(15000000000) # 2017-07-14 04:40:00 +0200
時間オブジェクトにそのコンポーネントのいずれかを要求できます。
例…
時間オブジェクトが何日、月、または時間を表しているかを尋ねることができます:
t = Time.now puts t.day puts t.month puts t.hour
さらに、この日付が特定の曜日に対応しているかどうかを尋ねることもできます。
例 :
「この日は日曜日ですか?」
これらは述語メソッドであり、true
のいずれかを返します。 またはfalse
。
例 :
t = Time.now puts t.monday? puts t.sunday? puts t.friday?
試してみてください!
タイムゾーン
Time
オブジェクトにはタイムゾーンが関連付けられています。
Time
の現在のタイムゾーンを確認できます zone
を使用するオブジェクト メソッド。
これにより、タイムゾーンの省略形がわかります。
タイムゾーンオフセットが必要な場合 utc_offset
を使用できます 方法。このメソッドの出力は秒単位ですが、3600で割ると数時間で取得できます。
例 :
t = Time.now t.zone # "CET" t.utc_offset / 3600 # 1
現在の時刻をUTCで取得することもできます:
Time.now.utc
ルビータイムフォーマット
RubyはTime
をフォーマットします デフォルトでは特定の方法でオブジェクトを作成します。
しかし、何か他のものが必要な場合があります。
ユースケースに適応する何か 。
朗報です!
メソッドを使用できます ほぼ必要なフォーマットを取得するには 。
このメソッドはstrftime
です 、これは基本的に「フォーマット時間」を意味します。
これは、フォーマット指定子を含む文字列を渡すことで機能します。これらの指定子は値に置き換えられます。 printf
を使用したことがある場合 方法の考え方はそれに非常に似ています。
いくつかの例を見てみましょう :
time = Time.new time.strftime("%d/%m/%Y") # "05/12/2015" time.strftime("%k:%M") # "17:48" time.strftime("%I:%M %p") # "11:04 PM" time.strftime("Today is %A") # "Today is Sunday" time.strftime("%d of %B, %Y") # "21 of December, 2015" time.strftime("Unix time is %s") # "Unix time is 1449336630"
ご覧のとおり、この方法は非常に柔軟です。日付なしの時刻、または年、日、現在の月の名前を含む適切にフォーマットされた日付を取得できます。
Strftimeフォーマットテーブル
%d | 月の日(01..31) |
%m | 年の月(01..12)%-m を使用 for(1..12) |
%k | 時間(0..23) |
%M | |
%S | 秒(00..60) |
%I | 時間(1..12) |
%p | AM / PM |
%Y | |
%A | 曜日(名前) |
%B | 月(名前) |
次のリンクで利用可能なさまざまな形式の詳細を見つけることができます:
- https://strftime.net/
- https://devdocs.io/ruby/time#method-i-strftime
タイムスタンプの生成
タイムゾーンに依存しないタイムスタンプを生成して、特定のイベントを日付にすることができます。
方法は次のとおりです :
Time.now.to_i # 1549054305
このタイムスタンプは、UTC(協定世界時)の秒数です。
時差(足し算と引き算)
現在の時刻ではなく、将来または過去の時刻が必要な場合があります。
時間オブジェクトで足し算ができます!
Time
の内部表現を忘れないでください は秒単位なので、これを行うことができます:
# Add ten seconds time = Time.new + 10
この例では、現在の時刻から10秒後に設定された時刻オブジェクトを取得します。
次に、その時間がまだ経過しているかどうかを確認できます。
Time.new > time
昨日のようなものを取得したい場合は、1日に何秒あるかを計算する必要があります。
このように :
# seconds * minutes * hours 60 * 60 * 24 # 86400
これで、この番号を使用して、現在の日付からそれを推測できます:
Time.now - 86400
Railsを使用している場合は、次のことができます。
Time.now - 1.day
日付クラス
Date
クラスには、分、秒、または時間の概念はありません。このクラスは、すべてを日数で内部的に保存します。
Date
を使用するには require 'date'
が必要なクラス 。
Date.today
を使用して現在の日付を取得できます 。
時間とは異なり、Date.new
today
のエイリアスではありません 、そのことを覚えておいてください。
Date.today # Current date Date.new # Returns a negative date
日付の計算はTime
に似ています クラスでは、違いは秒ではなく日を追加することです。
Date.today + 1 # Adds one day
Date
時間、秒、分については何も知らないので、これらが必要ない場合にのみこのクラスを使用してください。
日付と時刻の解析
Date.parse
メソッドは、日付のように見える文字列を解析しようとします。
入力形式を検出しようとする単純なヒューリスティックアルゴリズムを使用します。
これにより、望ましくない結果が生じる場合があります。
例 :
Date.parse("10/10/2010") # -> 2010-10-10 Date.parse("September 3") # -> 2015-09-03 Date.parse("May I have a cup of coffee, please?") # -> 1 of May
より厳密なものが必要な場合は、Date.iso8601
を使用できます。 メソッド。
iso8601
日付の形式は次のとおりです。
year-month-day
ArgumentError
無効な入力で例外が発生します。
例 :
Date.iso8601("2018-10-01")
Date.strptime
を使用できます メソッドと、独自のカスタム入力フォーマットを提供するためのフォーマット指定子のセット。これらは、strftime
に使用できるのと同じ指定子です。 。
例 :
Date.strptime("3 of September", "%d of %B") # 2015-09-03
Time
を使用して時間を解析できます クラス。
言い換えれば :
「2018-01-0100:00」のような文字列をTimeオブジェクトに変換する方法!
ここに例があります :
require 'time' Time.parse("September 20 18:00")
入力文字列の形式を指定する場合は、strptime
を使用できます。 メソッド。
このように :
require 'time' Time.strptime("1 of December 2017", "%d of %B %Y")
Time.parse
の唯一の違い &Date.parse
返されるオブジェクトの種類です(Time
またはDate
。
日付定数
Date
クラスには、役立つと思われる定数がいくつかあります。
たとえば、年の月と曜日の配列があります。
月はインデックス1から始まるため、month number -> month name
を直接取得できます。 マッピング。
日は日曜日から始まりますが、rotate
を使用できます 週を月曜日に開始する方法。
Date::MONTHNAMES # (index 0 = nil) Date::DAYNAMES.rotate(1)
DateTimeクラス
DateTime
classはDate
のサブクラスです 日付に加えて秒を保存できます。
例 :
require 'date' DateTime.superclass # Date DateTime.now # DateTime: 2018-10-15T16:06:39+02:00
両方のTime
およびDateTime
同じ仕事を成し遂げることができますが、主な違いはTime
C
で実装されています 、したがって高速になります。
パフォーマンス :
Comparison: Time: 2644596.6 i/s DateTime: 231634.8 i/s - 11.42x slower
ActiveSupport –時刻と日付のメソッド
Railsを使用したことがある場合は、おそらく3.days.ago
のようなものに精通しているでしょう。 。
これらのメソッドは純粋なRubyでは使用できません。ActiveSupport
によって追加されます。 Railsのコンポーネント。
ここにいくつかの例があります。これらのメソッドがTime
を返さないことに注意してください。 またはDate
オブジェクトですが、カスタムのActiveSupport
クラス。
1.hour.to_i # 3600 1.day # ActiveSupport::Duration 3.days.ago # ActiveSupport::TimeWithZone
これらを使って時間の計算を行い、明日の日付などを取得できます。
Time.now + 1.day
その他のRails-排他的な時間方法:
date = Time.current date.change(hour: 20) date.at_beginning_of_day
そしてフォーマットのために:
date = Date.today date.to_formatted_s(:short) # "16 Jul" date.to_formatted_s(:long) # "July 16, 2018"
これらのメソッドのコードは実際には非常に単純なので、確認する必要があります。 TimeWithZoneのソースコードも一見の価値があります。
概要
この記事では、Time&Dateクラス、Rubyで時刻を解析およびフォーマットする方法、およびActiveSupport時間拡張機能を使用する方法について学習しました。
読んでくれてありがとう!
-
Rubyエイリアスキーワードの使用方法
Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin
-
RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた