ISO 형식의 날짜 문자열을 해당 구성 요소로 구문 분석

아카 페놈

나는 haskell을 처음 접했고 실제 응용 프로그램을 시도하여 학습에 접근하고 싶었습니다. 구성 요소 중 하나는 ISO 형식 문자열의 날짜를 구성 요소로 구문 분석 할 수 있습니다. 이 Stack Overflow 게시물 은 시작하는 데 도움 되었지만 충분하지 않으며 혼란 스럽습니다.

다음 코드가 있습니다.

import System.Locale
import Data.Time
import Data.Time.Format

data IsoDate  = IsoDate {
    year :: Int
    , month :: Int
    , day :: Int
} deriving (Show)

parseIsoDate :: String -> IsoDate
parseIsoDate dateString = 
    IsoDate year month day
    where 
        timeFromString = readTime defaultTimeLocale "%Y %m %d" dateString :: UTCTime
        year = 2013
        month = 10
        day = 31

2013 년 할로윈에는 멋지고 멋집니다. 저는 다음과 같이 연도를 다시 작성했습니다.

year = formatTime defaultTimeLocale "%y" timeFromString

실패 할 것이라는 것을 알았습니다 (를 IsoDate사용하여 유형을 구성 할 수 없음 String). 그런 다음 문자열을 Int로 읽으려고했습니다.

year = read (formatTime defaultTimeLocale "%y" timeFromString)

다음 응답으로 :

 parseIsoDate "2012-12-23"
 IsoDate {year = *** Exception: readsTime: bad input "2012-12-23"

이 전환을 시도하는 몇 가지 다른 시도가 있었지만 내가 게시 한 것은 가장 합리적인 시도였습니다. o 다른 시도는 게시하지 않겠습니다.

나는 현재 코드로 작업하는 방법을 알고 싶었습니다 (구문을 배우려고 할 때), 또한 (날짜 파싱이 필수적이기 때문에) 이것을 처리하는 더 좋은 방법 (아마도 가장 관용적)을 알고 싶습니다. 하스켈.

엡실론 할베

당신이해야 할 일은

parseIsoDate :: String -> Maybe IsoDate

String당신이 제공하는 모든 것이 유효한 날짜는 아니기 때문 입니다. 이를 구현하면 이미 대부분의 구성 요소를 올바르게 얻었 UTCTime지만 Day데이터 구조로 변환 할 수있는 a 를 구문 분석 할 필요는 없다고 생각 합니다.

import Data.Time

data IsoDate = ...

parseIsoDate :: String -> Maybe IsoDate
parseIsoDate str = do julianDay <- parse str
                      let (y, m, d) = toGregorian julianDay
                      return $ IsoDate (fromIntegral y) m d

  where parse:: String -> Maybe Day
        parse = parseTimeM True defaultTimeLocale "%F"

이제 약간의 설명과 조언 :

  1. 데이터 유형 IsoDateInteger수년 동안 사용하도록 변경할 것입니다. 데이터 유형 은 아마도 클 수 있기 때문입니다 (적어도 Int우주의 나이를보세요). 이것은 또한 toGregoriana를 변환하는 결과의 선택입니다. Day -> (Integer, Int, Int)그렇지 않은 경우 제 예에서 볼 수 있듯이 도움 Integer받아 생성 된를으로 변환해야합니다 .IntfromIntegral

  2. 내가 사용하는 구문은 do-syntax for 라고 합니다 Maybe. 이것은 첫 번째 줄에서 편리하게 모나드 내부의 값을 추출 하고 이름에 바인딩 합니다 julianDay. 그런 다음 값을 그레고리 안 데이로 변환합니다. 그리고 다시 return들어 Maybe갑니다. 첫 번째 단계가 실패하고를 생성하는 경우 Nothing, 즉 String그저 멍청이가 있으면 다른 작업이 수행되지 않고 프로그램이 작업을 수행하지 않고 완료됩니다 (게으른 평가의 힘입니다).

최신 정보

RecordWildCards확장 프로그램을 사용하고있을 수 있다는 사실이 Functor다음을 수행 할 수 있습니다.

{-# LANGUAGE Record
module MyLib
import Data.Time

data IsoDate = IsoDate { year :: Integer
                       , month :: Int
                       , day :: Int}
              deriving (Show)

parseIsoDate :: String -> Maybe IsoDate
parseIsoDate str = do (year, month, day) <- toGregorian <$> parse str
                      return IsoDate{..}

  where parse:: String -> Maybe Day
        parse = parseTimeM True defaultTimeLocale "%F"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

날짜 문자열을 다른 형식으로 구문 분석

분류에서Dev

Clojure의 특정 형식으로 날짜 및 시간을 가져 오기 위해 문자열 구문 분석

분류에서Dev

문자열 날짜를 특정 형식으로 구문 분석

분류에서Dev

문자열을 날짜 형식으로 구문 분석 할 수 없습니다.

분류에서Dev

ISO-8601 날짜 문자열을 날짜로 구문 분석 할 수 없습니다.

분류에서Dev

이상한 형식으로 R의 날짜 구문 분석

분류에서Dev

구문 분석을 통해 문자열을 날짜 시간으로 변환

분류에서Dev

날짜 문자열의 일부로 초를 구문 분석

분류에서Dev

형식의 선택적 문자로 날짜를 구문 분석하는 방법

분류에서Dev

SimpleDateFormat으로 구문 분석하기 위해 DateTimePicker에서 날짜 문자열의 형식을 올바르게 지정하는 방법은 무엇입니까?

분류에서Dev

일부 문자열 날짜를 다른 형식으로 구문 분석

분류에서Dev

coldfusion-문자열 날짜를 datetime 형식으로 구문 분석

분류에서Dev

특정 형식으로 날짜 / 시간 문자열 구문 분석

분류에서Dev

Java는 8601 형식의 문자열을 더 읽기 쉬운 날짜 구문 분석 오류로 구문 분석합니다.

분류에서Dev

Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

분류에서Dev

Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

분류에서Dev

정규식으로 날짜 형식 구문 분석

분류에서Dev

JS : 시간 문자열 (hh : mm)을 날짜로 구문 분석

분류에서Dev

Spark Scala를 사용하여 데이터를 날짜 형식으로 가져 오기 위해 문자열 열을 구문 분석합니다.

분류에서Dev

문자열 날짜 형식을 시간으로 만 구문 분석하는 방법

분류에서Dev

"Nov 17, 2016 7:26:57 PM"형식의 날짜 문자열을 날짜로 어떻게 구문 분석합니까?

분류에서Dev

csv 특정 날짜 형식을 logstash의 날짜로 구문 분석하지 못했습니다.

분류에서Dev

날짜 번호 뒤의 문자로 날짜를 구문 분석하는 방법

분류에서Dev

dart에서 임의의 날짜 형식 구문 분석

분류에서Dev

Android 구문 분석 날짜 단순 날짜 형식

분류에서Dev

다른 형식의 TextField에서 Java 구문 분석 날짜

분류에서Dev

Linux 날짜 구문 분석을 FreeBSD로 이식

분류에서Dev

문자열 날짜를 긴 자바로 구문 분석

분류에서Dev

VB.NET에서 날짜를 iso로 구문 분석하는 방법

Related 관련 기사

  1. 1

    날짜 문자열을 다른 형식으로 구문 분석

  2. 2

    Clojure의 특정 형식으로 날짜 및 시간을 가져 오기 위해 문자열 구문 분석

  3. 3

    문자열 날짜를 특정 형식으로 구문 분석

  4. 4

    문자열을 날짜 형식으로 구문 분석 할 수 없습니다.

  5. 5

    ISO-8601 날짜 문자열을 날짜로 구문 분석 할 수 없습니다.

  6. 6

    이상한 형식으로 R의 날짜 구문 분석

  7. 7

    구문 분석을 통해 문자열을 날짜 시간으로 변환

  8. 8

    날짜 문자열의 일부로 초를 구문 분석

  9. 9

    형식의 선택적 문자로 날짜를 구문 분석하는 방법

  10. 10

    SimpleDateFormat으로 구문 분석하기 위해 DateTimePicker에서 날짜 문자열의 형식을 올바르게 지정하는 방법은 무엇입니까?

  11. 11

    일부 문자열 날짜를 다른 형식으로 구문 분석

  12. 12

    coldfusion-문자열 날짜를 datetime 형식으로 구문 분석

  13. 13

    특정 형식으로 날짜 / 시간 문자열 구문 분석

  14. 14

    Java는 8601 형식의 문자열을 더 읽기 쉬운 날짜 구문 분석 오류로 구문 분석합니다.

  15. 15

    Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

  16. 16

    Android에서 ISO 8601 문자열을 Java 날짜로 구문 분석하는 방법

  17. 17

    정규식으로 날짜 형식 구문 분석

  18. 18

    JS : 시간 문자열 (hh : mm)을 날짜로 구문 분석

  19. 19

    Spark Scala를 사용하여 데이터를 날짜 형식으로 가져 오기 위해 문자열 열을 구문 분석합니다.

  20. 20

    문자열 날짜 형식을 시간으로 만 구문 분석하는 방법

  21. 21

    "Nov 17, 2016 7:26:57 PM"형식의 날짜 문자열을 날짜로 어떻게 구문 분석합니까?

  22. 22

    csv 특정 날짜 형식을 logstash의 날짜로 구문 분석하지 못했습니다.

  23. 23

    날짜 번호 뒤의 문자로 날짜를 구문 분석하는 방법

  24. 24

    dart에서 임의의 날짜 형식 구문 분석

  25. 25

    Android 구문 분석 날짜 단순 날짜 형식

  26. 26

    다른 형식의 TextField에서 Java 구문 분석 날짜

  27. 27

    Linux 날짜 구문 분석을 FreeBSD로 이식

  28. 28

    문자열 날짜를 긴 자바로 구문 분석

  29. 29

    VB.NET에서 날짜를 iso로 구문 분석하는 방법

뜨겁다태그

보관