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

Safe HaskellSafe-Infered




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 ?

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.

spanIntersect :: DateSpan -> DateSpan -> DateSpanSource

Calculate the intersection of two datespans.

spansIntersect :: [DateSpan] -> DateSpanSource

Calculate the intersection of a number of datespans.

spanUnion :: DateSpan -> DateSpan -> DateSpanSource

Calculate the union of two datespans.

spansUnion :: [DateSpan] -> DateSpanSource

Calculate the union of a number of datespans.

orDatesFrom :: DateSpan -> DateSpan -> DateSpanSource

Combine two datespans, filling any unspecified dates in the first with dates from the second.

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 spans at the specified interval.

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".