เวลาเป็นคลาสในภาษา 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
ขอบคุณสำหรับการอ่าน!