BESCHREIBUNGArbeiten mit Datum Zeit Zeichenfolge
I-Eingang als String Datum zu erhalten, muß die vollständige Datum Zeitformat mit Zeitzone sein kann, ist es nur mehr aktuell sein könnte, könnte es nur Zeit im 24-Stunden-Format , Zeit mit Zeitzone im 24-Stunden-Format oder eine Zeit in am und pm oder eine beliebige Kombination von oben.
Als Ausgabe möchte ich aktuelle (oder angegebene) Datum zusammen mit Zeit im 24-Stunden-Format und einer Zeitzone, die wir in einem Rubin Time.parse()
analysieren können. Ich habe etwas gearbeitet, und Sie können den Quellcode unten finden. Ich habe auch rspec (Testfall) für einige der Erwartung hinzugefügt.
Sie können Ihre eigene Lösung bereitstellen oder meine Quelle aktualisieren, wie Sie möchten.
Beispiele
HINWEIS: hier ist zu erwarten Datum aktuelles Datum, wenn das Datum
bereitgestellt"2016-1-1T01:00:00 +0000"
erhalten umgewandelt"2016-1-1T22:00:00 +0500"
erhalten umgewandelt nicht
'2200+5'
sollte'100'
sollte'1700+8'
sollte"2016-1-1T17:00:00 +0800"
'5pm+8'
konvertiert werden sollten'5am+8'
-"2016-1-1T17:00:00 +0800"
konvertiert werden soll konvertiert werden zu"2016-1-1T5:00:00 +0800"
'2016-12-15T2300+5'
sollte'530pm+8'
-"2016-1-1T17:30:00 +0000"
erhalten umgewandelt'1730'
-'2016-12-15T23:00:00 +0500'
konvertiert werden sollten sollte konvertierte erhalten zu"2016-1-1T17:30:00 +0800"
'1210am+8'
sollte"2016-1-1T12:10:00 +0800"
konvertiert werden
RSpec
describe "should convert datetime to accepted format"
Timecop.freeze(Time.utc(2016,1,1,2,0,0))
it {expect(parse('2200+5')).to eq({time: Time.parse("2016-1-1T22:00:00 +0500")})}
it {expect(parse('100')).to eq({time: Time.parse("2016-1-1T01:00:00 +0000")})}
it {expect(parse('1700+8')).to eq({time: Time.parse("2016-1-1T17:00:00 +0800")})}
it {expect(parse('5pm+8')).to eq({time: Time.parse("2016-1-1T17:00:00 +0800")})}
it {expect(parse('5am+8')).to eq({time: Time.parse("2016-1-1T5:00:00 +0800")})}
it {expect(parse('2016-12-15T2300+5')).to eq({time: Time.parse("2016-12-15T23:00:00 +0500")})}
it {expect(parse('1730')).to eq({time: Time.parse("2016-1-1T17:30:00 +0000")})}
Timecop.return
end
WAS BISHER ich getan habe
# ensure 2 char in time format
def ensure_2_char_in_time(t)
return "0#{t}" if t.to_s.length == 1
t.to_s
end
def get_time_zone_from(aTimeParams)
date, tzm, tzm_type = nil
# get date, time, timezon from given string
if aTimeParams.include?('-') && aTimeParams.include?('T')
date, time_zone = aTimeParams.split('T')
else
time_zone = aTimeParams
end
# get time, zone from given string
if time_zone.include?('+')
tzm_type = '+'
time_str, tzm = aTimeParams.split('+')
elsif time_zone.include?('-')
tzm_type = '-'
time_str, tzm = aTimeParams.split('-')
else
tzm_type = '+'
time_str = aTimeParams
end
date = "#{Date.today.year}-#{Date.today.month}-#{Date.today.day}" if date.blank?
if time_str.include?('pm')
hour = ensure_2_char_in_time(time_str.to_i + 12)
min = '00'
elsif time_str.include?('am')
hour = ensure_2_char_in_time(time_str.to_i)
min = '00'
else
hour = ensure_2_char_in_time(time_str.to_i/100)
min = ensure_2_char_in_time(time_str.to_i % 100)
end
if tzm.to_s.length <= 2
tzm_h = ensure_2_char_in_time tzm.to_i % 100
tzm_m = "00"
else
tzm_h = ensure_2_char_in_time tzm.to_i/100
tzm_m = ensure_2_char_in_time tzm.to_i % 100
end
{
time: Time.parse("#{date}T#{hour}:#{min}:00 #{tzm_type}#{tzm_h}:#{tzm_m}"),
tzm: (tzm_h.to_i * 60 + tzm_m.to_i)
}
end
Bitte lassen Sie mich zur weiteren Klärung wissen.
Dank
Danke für den Vorschlag, lassen Sie mich das tun – przbadu