แปลง String เป็น DateTime


101

ฉันต้องการแยกวิเคราะห์ String ต่อไปนี้เป็น DateTime Object:
30/Nov/2009:16:29:30 +0100

มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?

PS:ฉันต้องการแปลงสตริงด้านบนตามที่เป็นอยู่ ลำไส้ใหญ่หลังปีไม่ใช่การพิมพ์ผิด ฉันยังต้องการแก้ปัญหาด้วย Ruby ไม่ใช่ RoR

คำตอบ:


101

DateTime.strptimeช่วยให้คุณระบุรูปแบบและแปลง String เป็น DateTime


1
ขอบคุณ. พลาดที่ฉันสามารถกำหนดรูปแบบของฉันเองได้ นี่คือสิ่งที่ใช้ได้ผล: '% d /% b /% Y:% H:% M:% S'
SkaveRat

1
@SkaveRat สตริงของคุณเคารพเขตเวลาหรือไม่? ฉันใช้%d/%b/%Y:%H:%M:%S %Z
knut

4
สำหรับรายการตัวย่อรูปแบบที่มีให้ gist.github.com/halloffame/5350249
Ryan

9
การระบุตัวอย่างการแปลงสตริงจะเป็นการสุภาพซึ่งผู้ใช้ถามไม่ใช่แค่ "ไปอ่านที่นั่น" (ข้อมูลมากมายอยู่ที่ไหน) Stackoverflow ไม่ได้รับความนิยมเนื่องจากให้ลิงก์ไปยังเอกสารภายนอก แต่ให้คำตอบสำหรับคำถาม
Daniel Garmoshka

มีวิธีใดบ้างที่จะทำให้ "ตรงกันทุกประการ"? ปัจจุบันพฤติกรรมคือ "การจับคู่จากจุดเริ่มต้น" จึง%Yจะตรงกับทั้งสอง2015(ตามคาด) และเนื่องจากมันหยุดเมื่อเห็น2016-foo-bar 2016พฤติกรรมนี้สอดคล้องกับคู่ C; อย่างไรก็ตามฟังก์ชัน C จะส่งคืนตำแหน่งของจุดสิ้นสุดของการจับคู่ (เช่นครั้งแรก-ในกรณี "2016") เพื่อให้เราตัดสินใจว่าการจับคู่นั้นถูกต้องหรือไม่ ใน Ruby จะส่งกลับ a DateTimeดังนั้นเราจึงไม่สามารถบอกได้ว่ายังมีอะไรอยู่หรือไม่
Franklin Yu

98

สิ่งนี้ไม่ควรใช้ได้กับ Railsหรือไม่?

"30/Nov/2009 16:29:30 +0100".to_datetime

1
ทำงานอย่างใน Rails 3.2.3 ใช้ทับทิม 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Wed, 16 พฤษภาคม 2012 02:30:00 0000
Tilo

59
นี่เป็นวิธี Ruby on Rails ไม่ใช่วิธี Ruby
JackCA

5
สิ่งนี้ควรจะเป็น: require 'active_support/all' จากนั้น "30/Nov/2009 16:29:30 +0100".to_datetime (คุณไม่จำเป็นต้องใช้ส่วนขยาย active_support ทั้งหมด แต่ขอให้โชคดีในการหาส่วนขยายที่ต้องการ)
Matt Zukowski

2
ActiveSupport ได้รับการจัดวางไว้อย่างสวยงาม แต่เพื่อให้ได้ผลกระทบน้อยที่สุดสิ่งนี้ควรเป็นสิ่งที่คุณต้องto_datetimeเพิ่มในStringวัตถุ:require 'active_support/core_ext/string/conversions'
xentek

3
คำถามคือประมาณ "30 / พ.ย. / 2552: 16: 29: 30 +0100" ไม่ใช่ "30 / พ.ย. / 2552 16:29:30 +0100" นั่นเป็นอีกสาเหตุหนึ่งที่ทำให้ไม่ได้ผล
schmijos


15

ฉันเคยใช้Time.parse("02/07/1988")เหมือนโปสเตอร์อื่น ๆ

gotcha ที่น่าสนใจTimeคือโหลดโดยค่าเริ่มต้นเมื่อฉันเปิด IRB แต่Time.parseไม่ได้กำหนดไว้ ฉันต้องrequire 'time'ทำให้มันทำงาน

นั่นคือ Ruby 2.2



12

สิ่งนี้จะแปลงสตริงในวันที่เป็นวันที่และเวลาหากใช้Rails :

"05/05/2012".to_time

เอกสารอ้างอิง: https://apidock.com/rails/String/to_time


21
นี่คือวิธี Ruby on Rails ไม่ใช่วิธี Ruby
JackCA

1
แม้ว่านี่จะไม่ใช่คำตอบสำหรับคำถามนี้ แต่ก็ช่วยฉันได้มาก ขอบคุณ @ user1425976
karlingen

ทำไมคนถึงโพสต์ Rails ในคำถาม Ruby?
Zeeshan

5

ใน 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

1

คุณสามารถแยกวิเคราะห์สตริงวันเวลาด้วยเขตเวลาที่กำหนดได้เช่นกัน:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.