복붙노트

[RUBY-ON-RAILS] 레일 : 어떻게 특정 시간대에 날짜 - 시간 문자열을 구문 분석

RUBY-ON-RAILS

레일 : 어떻게 특정 시간대에 날짜 - 시간 문자열을 구문 분석

나는 레일 3.2을 사용하고 데비안에 1.9.3 루비 있어요. 나는 HTML 양식을 사용하여 문자열의 형태로 날짜, 시간 및 시간대를 수집하는 응용 프로그램을 가지고있다. 이 같은:

start_date: "04-15-2010",
start_time: "10:00:00",
timezone: "Central Time (US & Canada)"

내가 뭘하려는는 UTC 시간대의 일단이 경우, 시작 시간 7 시간 추가 할 UTC, 같은 내 데이터베이스에 저장되는 단일 날짜에 이러한 3 개 요소를 분석이다. 이 UTC 대신 수신 중부 시간으로 DB에 일단 저장된 시간은 17:00이 될 것입니다 그래서.

나는 날짜를 구문 분석 같은 것을 시도했다 :

ActiveSupport::TimeZone[timezone].at DateTime.strptime("{ 2012-04-09 20:00:00 }", "{ %Y-%m-%d %H:%M:%S }").to_i

그러나, 나는 %의 Z와 결과 시간에 시간대를 통합 할 수 아니에요. 이 중 하나를 구문 분석하지 않거나 시간이 UTC 중앙하지 시간으로 해석됩니다. 내 질문은 그래서, 어떻게 저장된 실제 날짜 / 시간의 값을 변경하지 않고 특정 시간대에 날짜 문자열을 강요합니다. 나는 미래의 시간대 변환이 정확한지 그래서 그 때 그것으로 올바른 시간대를 포함하는 날짜 / 시간 객체로 문자열을 구문 분석 할 수 있도록하고 싶습니다. 나는 모든 이상을 검토 한 결과이 작업을 수행 할 수있는 방법을 찾을 수 없습니다. 그것은이 뭔가 공통의 일처럼 보이기 때문에, 이상하다 HTML 양식에서 입력 된 날짜로한다. 어떤 도움 주셔서 감사합니다.

해결법

  1. ==============================

    1.%의 Z는 시간대 이름을 지정하는 올바른 방법입니다. 다음을 시도 해 봤나?

    %의 Z는 시간대 이름을 지정하는 올바른 방법입니다. 다음을 시도 해 봤나?

    date_and_time = '%m-%d-%Y %H:%M:%S %Z'
    DateTime.strptime("04-15-2010 10:00:00 Central Time (US & Canada)",date_and_time)
    
  2. ==============================

    2.이 시도:

    이 시도:

    zone = "Central Time (US & Canada)"  
    
    ActiveSupport::TimeZone[zone].parse("2013-04-03 17:47:00")
    
  3. ==============================

    3.나는 개인적으로 문자열 #의 in_time_zone를 사용하여 선호합니다 :

    나는 개인적으로 문자열 #의 in_time_zone를 사용하여 선호합니다 :

    >> '22.09.1986 10:30'.in_time_zone('Central Time (US & Canada)')
    # => Mon, 22 Sep 1986 10:30:00 CDT -05:00
    

    이 제공된 시간대에 문자열에서 날짜와 시간을 구문 분석합니다.

  4. ==============================

    4.이것은 내가 생각 해낸하는 방법이다. 아니 예쁜,하지만 그것을 작동합니다. 지정된 형식을 사용하여 문자열을 구문 분석하고 내가 Time.zone.parse이 필요 알고있는 포맷으로 전환 할 수 있습니다.

    이것은 내가 생각 해낸하는 방법이다. 아니 예쁜,하지만 그것을 작동합니다. 지정된 형식을 사용하여 문자열을 구문 분석하고 내가 Time.zone.parse이 필요 알고있는 포맷으로 전환 할 수 있습니다.

    class ActiveSupport::TimeZone
      def strptime(time, format='%m/%d/%Y')
        formatted = Time.strptime(time, format).strftime('%Y-%m-%d %T')
        parse(formatted)
      end
    end
    

    그럼 당신은하지만, 지정된 형식, 다른 질문에서 언급 한 것처럼 뭔가를 할 수 있습니다 :

    zone = "Central Time (US & Canada)"  
    ActiveSupport::TimeZone[zone].strptime('2013-04-03', '%Y-%m-%d')
    

    또는 당신은 이미 시간대 설정이있는 경우 :

    Time.zone = "Central Time (US & Canada)" 
    Time.zone.strptime('01/13/2006')
    

    나는 %의 m의 기본 형식을 사용 / % D / % Y 그게 내 사용자 입력이 대부분의 시간을 무엇 때문에. 당신은 당신의 요구에이를 사용자 정의하거나 믿습니다 기본 형식의 날짜 시간 사용을 사용할 수 있습니다 ISO8601 (% FT %의 T %의 z를)

  5. ==============================

    5.드디어 더러운, 아직이 작업을 수행하는 확실한 방법을 발견했습니다.

    드디어 더러운, 아직이 작업을 수행하는 확실한 방법을 발견했습니다.

    먼저, 다음과 같이 일반 루비 Time.strptime를 사용하여 문자열을 구문 분석 :

    time = Time.strptime('12 : 00 : PM', '%I : %M : %p')
    

    당신이 얻을이 방법은 올바른 시간대에 아직 시간 구문 분석,하지만. 이 문제를 해결하려면,하자가 문자열 형식으로 시간을 변환 표준 ActiveSupport로 구문 분석 :: 시간대 # 구문 분석

    Time.zone.parse(time.to_s)
    

    결과는 올바른 시간대로 파싱 우리의 시간과 ActiveSupport :: TimeWithZone입니다.

    우리가 이런 식으로해야 할 이유는 ActiveSupport :: 시간대도 ActiveSupport :: TimeWithZone도가 strptime 방법을 지원한다는 것입니다. 우리가 시간대 정보가없는 핵심 루비 strptime와 시간을 구문 분석 할 필요가 그래서, ActiveSupport이 객체에 허용 형식으로 변환 한 후 또 다시 구문 분석합니다.

  6. ==============================

    6.날짜 시간이 도약 날이, 쉬운, 나던 휴식을 사용하여 날짜 문자열을 가지고 날짜 문자열의 값을 변경하지 않고 UTC 이외의 시간대를 첨부해야합니다 :)

    날짜 시간이 도약 날이, 쉬운, 나던 휴식을 사용하여 날짜 문자열을 가지고 날짜 문자열의 값을 변경하지 않고 UTC 이외의 시간대를 첨부해야합니다 :)

    xx = DateTime.strptime("9/1/15 #{object.time_zone}", "%m/%d/%Y %Z")
    
  7. ==============================

    7.UTC에서 특정 날짜 형식을 변환합니다.

    UTC에서 특정 날짜 형식을 변환합니다.

    ActiveSupport::TimeZone['UTC'].parse(Time.strptime('01/24/2019T16:10:16', "%m/%d/%YT%H:%M:%S").asctime)
    
  8. from https://stackoverflow.com/questions/10091959/rails-how-to-parse-date-time-string-into-a-specific-time-zone by cc-by-sa and MIT license