เวลาเป็นคลาสในภาษา 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 | เดือน (ชื่อ) |
คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบต่างๆ ที่มีอยู่ในลิงก์ต่อไปนี้:
- http://strftime.net/
- http://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
ขอบคุณสำหรับการอ่าน!