hledger-lib-0.23: Core data types, parsers and utilities for the hledger accounting tool.

Safe HaskellNone




Date parsing and utilities for hledger.

For date and time values, we use the standard Day and UTCTime types.

A SmartDate is a date which may be partially-specified or relative. Eg 2008/12/31, but also 2008/12, 12/31, tomorrow, last week, next year. We represent these as a triple of strings like ("2008","12",""), ("","","tomorrow"), ("","last","week").

A DateSpan is the span of time between two specific calendar dates, or an open-ended span where one or both dates are unspecified. (A date span with both ends unspecified matches all dates.)

An Interval is ledger's "reporting interval" - weekly, monthly, quarterly, etc.


Misc date handling utilities

getCurrentDay :: IO DaySource

Get the current local date.

getCurrentMonth :: IO IntSource

Get the current local month number.

getCurrentYear :: IO IntegerSource

Get the current local year.

spanContainsDate :: DateSpan -> Day -> BoolSource

Does the span include the given date ?

parsedateM :: String -> Maybe DaySource

Parse a couple of date string formats to a time type.

parsedate :: String -> DaySource

Parse a date string to a time type, or raise an error.

parsePeriodExpr :: Day -> String -> Either ParseError (Interval, DateSpan)Source

Parse a period expression to an Interval and overall DateSpan using the provided reference date, or return a parse error.

spansSpan :: [DateSpan] -> DateSpanSource

Get overall span enclosing multiple sequentially ordered spans.

spanIntersect :: DateSpan -> DateSpan -> DateSpanSource

Calculate the intersection of two datespans.

spansIntersect :: [DateSpan] -> DateSpanSource

Calculate the intersection of a number of datespans.

spanDefaultsFrom :: DateSpan -> DateSpan -> DateSpanSource

Fill any unspecified dates in the first span with the dates from the second one. Sort of a one-way spanIntersect.

spanUnion :: DateSpan -> DateSpan -> DateSpanSource

Calculate the union of two datespans.

spansUnion :: [DateSpan] -> DateSpanSource

Calculate the union of a number of datespans.

smartdate :: GenParser Char st SmartDateSource

Parse a date in any of the formats allowed in ledger's period expressions, and maybe some others:

 october, oct
 yesterday, today, tomorrow
 this/next/last week/day/month/quarter/year

Returns a SmartDate, to be converted to a full date later (see fixSmartDate). Assumes any text in the parse stream has been lowercased.

splitSpan :: Interval -> DateSpan -> [DateSpan]Source

Split a DateSpan into one or more consecutive whole spans of the specified length which enclose it. If no interval is specified, the original span is returned.

fixSmartDate :: Day -> SmartDate -> DaySource

Convert a SmartDate to an absolute date using the provided reference date.

fixSmartDateStr :: Day -> String -> StringSource

Convert a smart date string to an explicit yyyy/mm/dd string using the provided reference date, or raise an error.

fixSmartDateStrEither :: Day -> String -> Either ParseError StringSource

A safe version of fixSmartDateStr.

daysInSpan :: DateSpan -> Maybe IntegerSource

Count the days in a DateSpan, or if it is open-ended return Nothing.

mkdatespan :: String -> String -> DateSpanSource

Make a datespan from two valid date strings parseable by parsedate (or raise an error). Eg: mkdatespan "201111" "20111231".