Rubyの時刻と日付のクラスの使用方法
時間は、特定の時点を表すのに役立つRubyのクラスです。
この記事を読むと、Rubyタイムウィザードになるために知っておく必要のあるすべてのことを学ぶことができます!
対象トピック :
- 文字列を時間オブジェクトに変換する方法
- 時間をコンポーネントに分割する方法(日/時間/ミリ秒…)
Dateの使用方法 、DateTime&TimeRubyのクラス- 任意の方法で時刻をフォーマットする方法
- 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つの値を一緒に格納するた