Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีใช้งาน Ruby Time &Date Classes

เวลาเป็นคลาสในภาษา Ruby ที่ช่วยให้คุณแสดงจุดเฉพาะของเวลาได้

หลังจากอ่านบทความนี้ คุณจะได้เรียนรู้ทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อเป็นนักช่วยสอน Ruby Time!

หัวข้อที่ครอบคลุม :

  • วิธีแปลงสตริงเป็นออบเจ็กต์เวลา
  • วิธีแบ่งเวลาออกเป็นส่วนประกอบ (วัน/ชั่วโมง/มิลลิวินาที…)
  • วิธีใช้ Date , DateTime &Time คลาสในภาษา Ruby
  • วิธีจัดรูปแบบเวลาในแบบที่คุณต้องการ
  • วิธีค้นหาความแตกต่างระหว่างสอง Time วัตถุ

มาทำสิ่งนี้กันเถอะ!

รูบี้ไทม์คลาส

คุณสามารถใช้ Time คลาสใน Ruby เพื่อแสดงเวลาและวันที่

วันที่นี้ มีสามองค์ประกอบ:

  • วัน
  • เดือน
  • ปี

และเวลา :

  • ชั่วโมง
  • นาที
  • วินาที

ข้อมูลนี้ถูกจัดเก็บโดย Time class เป็นจำนวนวินาทีนับตั้งแต่ยุคหรือที่เรียกว่าเวลา Unix

มีสองสามวิธีในการเริ่มต้น a 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?

ให้มันลอง!

เขตเวลา

A Time ออบเจ็กต์มีเขตเวลาที่เกี่ยวข้อง

คุณสามารถตรวจสอบเขตเวลาปัจจุบันสำหรับ Time วัตถุโดยใช้ zone วิธีการ

ซึ่งจะให้ตัวย่อเขตเวลาแก่คุณ

หากคุณต้องการชดเชยเขตเวลา คุณสามารถใช้ utc_offset กระบวนการ. ผลลัพธ์สำหรับวิธีนี้อยู่ในหน่วยวินาที แต่คุณสามารถหารด้วย 3600 เพื่อให้ได้เป็นชั่วโมง

ตัวอย่าง :

t = Time.now

t.zone
# "CET"

t.utc_offset / 3600
# 1

คุณยังสามารถรับเวลาปัจจุบันใน UTC:

Time.now.utc

การจัดรูปแบบเวลาทับทิม

รูปแบบทับทิม 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 สำหรับ (1..12)
%k ชั่วโมง (..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

หากคุณต้องการได้บางอย่างเช่นวันเมื่อวาน คุณจะต้องคำนวณว่ามีกี่วินาทีในหนึ่งวัน

ถูกใจสิ่งนี้ :

# seconds * minutes * hours

60 * 60 * 24
# 86400

ด้วยจำนวนนี้ เราสามารถระงับจากวันที่ปัจจุบัน:

Time.now - 86400

หากคุณกำลังใช้ Rails คุณสามารถทำได้:

Time.now - 1.day

คลาสเดท

Date ชั้นเรียนไม่มีแนวคิดเรื่องนาที วินาที หรือชั่วโมง ชั้นเรียนนี้เก็บทุกอย่างไว้ภายในเป็นวัน

การใช้งาน Date class คุณต้อง require 'date' .

คุณสามารถรับวันที่ปัจจุบันได้โดยใช้ Date.today .

ต่างจากเวลา Date.new ไม่ใช่นามแฝงสำหรับ today ให้จำไว้เสมอ

Date.today # Current date
Date.new   # Returns a negative date

เลขคณิตวันที่คล้ายกับ Time class ความแตกต่างคือคุณเพิ่มวันแทนที่จะเป็นวินาที

Date.today + 1  # Adds one day

Date ไม่รู้อะไรเกี่ยวกับชั่วโมง วินาที หรือนาที ดังนั้นให้ใช้คลาสนี้เฉพาะในกรณีที่คุณไม่ต้องการสิ่งเหล่านี้

การแยกวิเคราะห์วันที่ &เวลา

Date.parse method จะพยายามแยกสตริงที่ดูเหมือนวันที่

ใช้อัลกอริธึมฮิวริสติกอย่างง่ายที่พยายามตรวจหารูปแบบอินพุต

บางครั้งสิ่งนี้จะให้ผลลัพธ์ที่ไม่ต้องการ

ตัวอย่าง :

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 date มีรูปแบบดังนี้:

year-month-day

ArgumentError ข้อยกเว้นจะถูกยกขึ้นในการป้อนข้อมูลที่ไม่ถูกต้อง

ตัวอย่าง :

Date.iso8601("2018-10-01")

คุณสามารถใช้ Date.strptime method &ชุดของตัวระบุรูปแบบเพื่อจัดเตรียมรูปแบบอินพุตที่คุณกำหนดเอง นี่คือตัวระบุเดียวกันกับที่คุณใช้สำหรับ strftime .

ตัวอย่าง :

Date.strptime("3 of September", "%d of %B") # 2015-09-03

คุณสามารถแยกวิเคราะห์เวลาโดยใช้ Time ชั้นเรียน

กล่าวอีกนัยหนึ่ง :

วิธีแปลงสตริงเช่น '2018-01-01 00: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 ส่วนประกอบของราง

คุณจะพบตัวอย่างที่นี่ โปรดสังเกตว่าวิธีการเหล่านี้ไม่ส่งคืน 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

ขอบคุณสำหรับการอ่าน!