Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの時刻と日付のクラスの使用方法

時間は、特定の時点を表すのに役立つRubyのクラスです。

この記事を読むと、Rubyタイムウィザードになるために知っておく必要のあるすべてのことを学ぶことができます!

対象トピック

  • 文字列を時間オブジェクトに変換する方法
  • 時間をコンポーネントに分割する方法(日/時間/ミリ秒…)
  • Dateの使用方法 、DateTimeTime 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時間拡張機能を使用する方法について学習しました。

読んでくれてありがとう!


  1. Rubyエイリアスキーワードの使用方法

    Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた