ฉันต้องการแยกวิเคราะห์ String ต่อไปนี้เป็น DateTime Object:
30/Nov/2009:16:29:30 +0100
มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?
PS:ฉันต้องการแปลงสตริงด้านบนตามที่เป็นอยู่ ลำไส้ใหญ่หลังปีไม่ใช่การพิมพ์ผิด ฉันยังต้องการแก้ปัญหาด้วย Ruby ไม่ใช่ RoR
ฉันต้องการแยกวิเคราะห์ String ต่อไปนี้เป็น DateTime Object:
30/Nov/2009:16:29:30 +0100
มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?
PS:ฉันต้องการแปลงสตริงด้านบนตามที่เป็นอยู่ ลำไส้ใหญ่หลังปีไม่ใช่การพิมพ์ผิด ฉันยังต้องการแก้ปัญหาด้วย Ruby ไม่ใช่ RoR
คำตอบ:
DateTime.strptimeช่วยให้คุณระบุรูปแบบและแปลง String เป็น DateTime
%d/%b/%Y:%H:%M:%S %Z
%Y
จะตรงกับทั้งสอง2015
(ตามคาด) และเนื่องจากมันหยุดเมื่อเห็น2016-foo-bar
2016
พฤติกรรมนี้สอดคล้องกับคู่ C; อย่างไรก็ตามฟังก์ชัน C จะส่งคืนตำแหน่งของจุดสิ้นสุดของการจับคู่ (เช่นครั้งแรก-
ในกรณี "2016") เพื่อให้เราตัดสินใจว่าการจับคู่นั้นถูกต้องหรือไม่ ใน Ruby จะส่งกลับ a DateTime
ดังนั้นเราจึงไม่สามารถบอกได้ว่ายังมีอะไรอยู่หรือไม่
สิ่งนี้ไม่ควรใช้ได้กับ Railsหรือไม่?
"30/Nov/2009 16:29:30 +0100".to_datetime
require 'active_support/all'
จากนั้น "30/Nov/2009 16:29:30 +0100".to_datetime
(คุณไม่จำเป็นต้องใช้ส่วนขยาย active_support ทั้งหมด แต่ขอให้โชคดีในการหาส่วนขยายที่ต้องการ)
to_datetime
เพิ่มในString
วัตถุ:require 'active_support/core_ext/string/conversions'
ฉันประสบความสำเร็จกับ:
require 'time'
t = Time.parse(some_string)
ฉันเคยใช้Time.parse("02/07/1988")
เหมือนโปสเตอร์อื่น ๆ
gotcha ที่น่าสนใจTime
คือโหลดโดยค่าเริ่มต้นเมื่อฉันเปิด IRB แต่Time.parse
ไม่ได้กำหนดไว้ ฉันต้องrequire 'time'
ทำให้มันทำงาน
นั่นคือ Ruby 2.2
สำหรับนักพัฒนา Rails ของจีน:
DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
สิ่งนี้จะแปลงสตริงในวันที่เป็นวันที่และเวลาหากใช้Rails :
"05/05/2012".to_time
เอกสารอ้างอิง: https://apidock.com/rails/String/to_time
ใน Ruby 1.8 โมดูล ParseDate จะแปลงรูปแบบวันที่ / เวลาอื่น ๆ อีกมากมาย อย่างไรก็ตามมันไม่ได้จัดการกับลำไส้ใหญ่ระหว่างปีและชั่วโมงอย่างสง่างาม สมมติว่าลำไส้ใหญ่พิมพ์ผิดและเป็นช่องว่างจากนั้น:
#!/usr/bin/ruby1.8
require 'parsedate'
s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s)) # => Mon Nov 30 16:29:30 -0700 2009
คุณสามารถแยกวิเคราะห์สตริงวันเวลาด้วยเขตเวลาที่กำหนดได้เช่นกัน:
zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00