diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e6e187..4848def 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Notable changes to this project are documented in this file. The format is based Breaking changes (😱!!!): - Added support for PureScript 0.14 and dropped support for all previous versions (#62, #64) +- Added support for lower-case meridiem via a new `FormatterCommand` constructor `MeridiemLowerCase` New features: diff --git a/README.md b/README.md index ef8ca81..42b674f 100644 --- a/README.md +++ b/README.md @@ -50,26 +50,27 @@ then use formatter to result of division of input number and that power. This is a subset of common format/parse strings currently supported. -+ `YYYY` - Full Year (1999) -+ `YY` - 2 digit year (99) -+ `MMMM` - Full Month (January) -+ `MMM` - Short Month (Jan) -+ `DD` - Padded Day (02) -+ `D` - Day of month (2) -+ `X` - Unix Timestamp (1506875681) -+ `E` - Day of Week (2) -+ `dddd` - DOW Name (Monday) -+ `ddd` - DOW Name Short (Mon) -+ `HH` - 24 Hour (13) -+ `hh` - 12 Hour (1) -+ `a` - Meridiem (am/pm) -+ `mm` - Minutes Padded (02) -+ `m` - Minutes (2) -+ `ss` - Seconds Padded (02) -+ `s` - Seconds (2) -+ `S` - MilliSeconds (4) -+ `SS` - MilliSeconds (04) -+ `SSS` - MilliSeconds (004) ++ `YYYY` - Full Year (1999) ++ `YY` - 2 digit year (99) ++ `MMMM` - Full Month (January) ++ `MMM` - Short Month (Jan) ++ `DD` - Padded Day (02) ++ `D` - Day of month (2) ++ `X` - Unix Timestamp (1506875681) ++ `E` - Day of Week (2) ++ `dddd` - DOW Name (Monday) ++ `ddd` - DOW Name Short (Mon) ++ `HH` - 24 Hour (13) ++ `hh` - 12 Hour (1) ++ `a` - Meridiem (AM/PM) ++ `A` - MeridiemLowerCase (am/pm) ++ `mm` - Minutes Padded (02) ++ `m` - Minutes (2) ++ `ss` - Seconds Padded (02) ++ `s` - Seconds (2) ++ `S` - MilliSeconds (4) ++ `SS` - MilliSeconds (04) ++ `SSS` - MilliSeconds (004) Full list is defined [here](https://github.com/slamdata/purescript-formatters/blob/master/src/Data/Formatter/DateTime.purs) diff --git a/src/Data/Formatter/DateTime.purs b/src/Data/Formatter/DateTime.purs index a096a0b..927619b 100644 --- a/src/Data/Formatter/DateTime.purs +++ b/src/Data/Formatter/DateTime.purs @@ -63,6 +63,7 @@ data FormatterCommand | Hours24 | Hours12 | Meridiem + | MeridiemLowerCase | Minutes | MinutesTwoDigits | Seconds @@ -97,6 +98,7 @@ printFormatterCommand = case _ of Hours24 → "HH" Hours12 → "hh" Meridiem → "a" + MeridiemLowerCase → "A" Minutes → "m" MinutesTwoDigits → "mm" Seconds → "s" @@ -114,7 +116,7 @@ parseFormatString = runP formatParser placeholderContent ∷ P.Parser String String placeholderContent = - CU.toCharArray "YMDEHhamsS" + CU.toCharArray "YMDEHhaAmsS" # PS.noneOf # Array.some <#> CU.fromCharArray @@ -136,6 +138,7 @@ formatterCommandParser = (PC.try <<< PS.string) `oneOfAs` , Tuple "HH" Hours24 , Tuple "hh" Hours12 , Tuple "a" Meridiem + , Tuple "A" MeridiemLowerCase , Tuple "mm" MinutesTwoDigits , Tuple "m" Minutes , Tuple "ss" SecondsTwoDigits @@ -180,6 +183,7 @@ formatCommand dt@(DT.DateTime d t) = case _ of Hours24 → padSingleDigit (fromEnum $ T.hour t) Hours12 → padSingleDigit $ fix12 $ (fromEnum $ T.hour t) `mod` 12 Meridiem → if (fromEnum $ T.hour t) >= 12 then "PM" else "AM" + MeridiemLowerCase → if (fromEnum $ T.hour t) >= 12 then "pm" else "am" Minutes → show $ fromEnum $ T.minute t MinutesTwoDigits → padSingleDigit <<< fromEnum $ T.minute t Seconds → show $ fromEnum $ T.second t @@ -382,6 +386,7 @@ unformatCommandParser = case _ of Hours12 → _{hour = _} `modifyWithParser` (parseInt 2 (validateRange 0 12 <> exactLength) "Incorrect 12 hour") Meridiem → _{meridiem = _} `modifyWithParser` parseMeridiem + MeridiemLowerCase → _{meridiem = _} `modifyWithParser` parseMeridiem MinutesTwoDigits → _{minute = _} `modifyWithParser` (parseInt 2 (validateRange 0 59 <> exactLength) "Incorrect 2-digit minute") Minutes → _{minute = _} `modifyWithParser` diff --git a/test/src/DateTime.purs b/test/src/DateTime.purs index 643519a..f951f76 100644 --- a/test/src/DateTime.purs +++ b/test/src/DateTime.purs @@ -30,8 +30,11 @@ datetimeTest = describe "Data.Formatter.DateTime" do , { format: "YY", dateStr: "00" , date: makeDateTime 0 4 12 0 0 0 0} -- Format 0 with YY , { format: "YY", dateStr: "01" , date: makeDateTime (-1) 4 12 0 0 0 0} -- Format -1 with YY , { format: "hh:m:s a", dateStr: "11:3:4 AM", date: makeDateTime 2017 4 12 11 3 4 234 } + , { format: "hh:m:s A", dateStr: "11:3:4 am", date: makeDateTime 2017 4 12 11 3 4 234 } , { format: "hh a", dateStr: "12 AM", date: makeDateTime 0 1 1 0 0 0 0 } , { format: "hh a", dateStr: "12 PM", date: makeDateTime 0 1 1 12 0 0 0 } + , { format: "hh A", dateStr: "12 am", date: makeDateTime 0 1 1 0 0 0 0 } + , { format: "hh A", dateStr: "12 pm", date: makeDateTime 0 1 1 12 0 0 0 } , { format: "hh:mm:ss a", dateStr: "11:03:04 AM", date: makeDateTime 2017 4 12 11 3 4 234 } , { format: "hh:mm:ss.SSS", dateStr: "11:12:30.123", date: makeDateTime 2017 4 10 11 12 30 123 } , { format: "hh:mm:ss.SSS", dateStr: "11:12:30.023", date: makeDateTime 2017 4 10 11 12 30 23 } @@ -138,6 +141,24 @@ dateformats = , FDT.DayOfMonthTwoDigits ] } + , { str: "HH:mma" + , lossless: false + , format: fromFoldable + [ FDT.Hours24 + , FDT.Placeholder ":" + , FDT.MinutesTwoDigits + , FDT.Meridiem + ] + } + , { str: "HH:mmA" + , lossless: false + , format: fromFoldable + [ FDT.Hours24 + , FDT.Placeholder ":" + , FDT.MinutesTwoDigits + , FDT.MeridiemLowerCase + ] + } , { str: "Y-MM-DD HH:mm:ss:SSS" , lossless: true , format: fromFoldable