mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
remove DateTime and Date types, use Day and UTCTime directly
This seems simplest for now, I might bring type synonyms back later.
This commit is contained in:
parent
b7616562d9
commit
630e22312b
111
Ledger/Dates.hs
111
Ledger/Dates.hs
@ -1,8 +1,5 @@
|
||||
{-|
|
||||
|
||||
'Date' and 'DateTime' are a helper layer on top of the standard UTCTime,
|
||||
Day etc.
|
||||
|
||||
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",""),
|
||||
@ -30,82 +27,62 @@ import Ledger.Types
|
||||
import Ledger.Utils
|
||||
|
||||
|
||||
instance Show Date where
|
||||
show (Date t) = formatTime defaultTimeLocale "%Y/%m/%d" t
|
||||
showDate :: Day -> String
|
||||
showDate d = formatTime defaultTimeLocale "%Y/%m/%d" d
|
||||
|
||||
instance Show DateTime where
|
||||
show (DateTime t) = formatTime defaultTimeLocale "%Y/%m/%d %H:%M:%S" t
|
||||
mkUTCTime :: Day -> TimeOfDay -> UTCTime
|
||||
mkUTCTime day tod = localTimeToUTC utc (LocalTime day tod)
|
||||
|
||||
mkDate :: Day -> Date
|
||||
mkDate day = Date (localTimeToUTC utc (LocalTime day midnight))
|
||||
|
||||
mkDateTime :: Day -> TimeOfDay -> DateTime
|
||||
mkDateTime day tod = DateTime (localTimeToUTC utc (LocalTime day tod))
|
||||
|
||||
today :: IO Date
|
||||
today :: IO Day
|
||||
today = do
|
||||
t <- getZonedTime
|
||||
return (mkDate (localDay (zonedTimeToLocalTime t)))
|
||||
return $ localDay (zonedTimeToLocalTime t)
|
||||
|
||||
now :: IO DateTime
|
||||
now = fmap DateTime getCurrentTime
|
||||
now :: IO UTCTime
|
||||
now = getCurrentTime
|
||||
|
||||
datetimeToDate :: DateTime -> Date
|
||||
datetimeToDate (DateTime (UTCTime{utctDay=day})) = Date (UTCTime day 0)
|
||||
elapsedSeconds :: Fractional a => UTCTime -> UTCTime -> a
|
||||
elapsedSeconds t1 t2 = realToFrac $ diffUTCTime t1 t2
|
||||
|
||||
elapsedSeconds :: Fractional a => DateTime -> DateTime -> a
|
||||
elapsedSeconds (DateTime dt1) (DateTime dt2) = realToFrac $ diffUTCTime dt1 dt2
|
||||
|
||||
dateToUTC :: Date -> UTCTime
|
||||
dateToUTC (Date u) = u
|
||||
|
||||
dateComponents :: Date -> (Integer,Int,Int)
|
||||
dateComponents = toGregorian . utctDay . dateToUTC
|
||||
|
||||
-- dateDay :: Date -> Day
|
||||
dateDay date = d where (_,_,d) = dateComponents date
|
||||
|
||||
-- dateMonth :: Date -> Day
|
||||
dateMonth date = m where (_,m,_) = dateComponents date
|
||||
dayToUTC :: Day -> UTCTime
|
||||
dayToUTC d = localTimeToUTC utc (LocalTime d midnight)
|
||||
|
||||
-- | Convert a fuzzy date string to an explicit yyyy/mm/dd string using
|
||||
-- the provided date as reference point.
|
||||
fixSmartDateStr :: Date -> String -> String
|
||||
fixSmartDateStr :: Day -> String -> String
|
||||
fixSmartDateStr t s = printf "%04d/%02d/%02d" y m d
|
||||
where
|
||||
pdate = fromparse $ parsewith smartdate $ map toLower s
|
||||
(y,m,d) = dateComponents $ fixSmartDate t pdate
|
||||
(y,m,d) = toGregorian $ fixSmartDate t sdate
|
||||
sdate = fromparse $ parsewith smartdate $ map toLower s
|
||||
|
||||
-- | Convert a SmartDate to an absolute date using the provided date as
|
||||
-- reference point.
|
||||
fixSmartDate :: Date -> SmartDate -> Date
|
||||
fixSmartDate refdate sdate = mkDate $ fromGregorian y m d
|
||||
fixSmartDate :: Day -> SmartDate -> Day
|
||||
fixSmartDate refdate sdate = fix sdate
|
||||
where
|
||||
(y,m,d) = fix sdate
|
||||
callondate f d = dateComponents $ mkDate $ f $ utctDay $ dateToUTC d
|
||||
fix :: SmartDate -> (Integer,Int,Int)
|
||||
fix ("","","today") = (ry, rm, rd)
|
||||
fix ("","this","day") = (ry, rm, rd)
|
||||
fix ("","","yesterday") = callondate prevday refdate
|
||||
fix ("","last","day") = callondate prevday refdate
|
||||
fix ("","","tomorrow") = callondate nextday refdate
|
||||
fix ("","next","day") = callondate nextday refdate
|
||||
fix ("","last","week") = callondate prevweek refdate
|
||||
fix ("","this","week") = callondate thisweek refdate
|
||||
fix ("","next","week") = callondate nextweek refdate
|
||||
fix ("","last","month") = callondate prevmonth refdate
|
||||
fix ("","this","month") = callondate thismonth refdate
|
||||
fix ("","next","month") = callondate nextmonth refdate
|
||||
fix ("","last","quarter") = callondate prevquarter refdate
|
||||
fix ("","this","quarter") = callondate thisquarter refdate
|
||||
fix ("","next","quarter") = callondate nextquarter refdate
|
||||
fix ("","last","year") = callondate prevyear refdate
|
||||
fix ("","this","year") = callondate thisyear refdate
|
||||
fix ("","next","year") = callondate nextyear refdate
|
||||
fix ("","",d) = (ry, rm, read d)
|
||||
fix ("",m,d) = (ry, read m, read d)
|
||||
fix (y,m,d) = (read y, read m, read d)
|
||||
(ry,rm,rd) = dateComponents refdate
|
||||
fix :: SmartDate -> Day
|
||||
fix ("","","today") = fromGregorian ry rm rd
|
||||
fix ("","this","day") = fromGregorian ry rm rd
|
||||
fix ("","","yesterday") = prevday refdate
|
||||
fix ("","last","day") = prevday refdate
|
||||
fix ("","","tomorrow") = nextday refdate
|
||||
fix ("","next","day") = nextday refdate
|
||||
fix ("","last","week") = prevweek refdate
|
||||
fix ("","this","week") = thisweek refdate
|
||||
fix ("","next","week") = nextweek refdate
|
||||
fix ("","last","month") = prevmonth refdate
|
||||
fix ("","this","month") = thismonth refdate
|
||||
fix ("","next","month") = nextmonth refdate
|
||||
fix ("","last","quarter") = prevquarter refdate
|
||||
fix ("","this","quarter") = thisquarter refdate
|
||||
fix ("","next","quarter") = nextquarter refdate
|
||||
fix ("","last","year") = prevyear refdate
|
||||
fix ("","this","year") = thisyear refdate
|
||||
fix ("","next","year") = nextyear refdate
|
||||
fix ("","",d) = fromGregorian ry rm (read d)
|
||||
fix ("",m,d) = fromGregorian ry (read m) (read d)
|
||||
fix (y,m,d) = fromGregorian (read y) (read m) (read d)
|
||||
(ry,rm,rd) = toGregorian refdate
|
||||
|
||||
prevday :: Day -> Day
|
||||
prevday = addDays (-1)
|
||||
@ -141,14 +118,14 @@ startofyear day = fromGregorian y 1 1 where (y,_,_) = toGregorian day
|
||||
-- parsing
|
||||
|
||||
-- | Parse a date-time string to a time type, or raise an error.
|
||||
parsedatetime :: String -> DateTime
|
||||
parsedatetime s = DateTime $
|
||||
parsedatetime :: String -> UTCTime
|
||||
parsedatetime s =
|
||||
parsetimewith "%Y/%m/%d %H:%M:%S" s $
|
||||
error $ printf "could not parse timestamp \"%s\"" s
|
||||
|
||||
-- | Parse a date string to a time type, or raise an error.
|
||||
parsedate :: String -> Date
|
||||
parsedate s = Date $
|
||||
parsedate :: String -> Day
|
||||
parsedate s =
|
||||
parsetimewith "%Y/%m/%d" s $
|
||||
error $ printf "could not parse date \"%s\"" s
|
||||
|
||||
|
@ -54,7 +54,7 @@ showEntry e =
|
||||
where
|
||||
precedingcomment = epreceding_comment_lines e
|
||||
description = concat [date, status, code, desc] -- , comment]
|
||||
date = showDate $ edate e
|
||||
date = showdate $ edate e
|
||||
status = if estatus e then " *" else ""
|
||||
code = if (length $ ecode e) > 0 then (printf " (%s)" $ ecode e) else ""
|
||||
desc = " " ++ edescription e
|
||||
@ -67,8 +67,7 @@ showEntry e =
|
||||
showamount = printf "%12s" . showMixedAmount
|
||||
showaccountname s = printf "%-34s" s
|
||||
showcomment s = if (length s) > 0 then " ; "++s else ""
|
||||
|
||||
showDate d = printf "%-10s" (show d)
|
||||
showdate d = printf "%-10s" (showDate d)
|
||||
|
||||
isEntryBalanced :: Entry -> Bool
|
||||
isEntryBalanced (Entry {etransactions=ts}) =
|
||||
|
@ -237,8 +237,8 @@ ledgerentry = do
|
||||
transactions <- ledgertransactions
|
||||
return $ balanceEntry $ Entry date status code description comment transactions (unlines preceding)
|
||||
|
||||
ledgerday :: Parser Day
|
||||
ledgerday = do
|
||||
ledgerdate :: Parser Day
|
||||
ledgerdate = do
|
||||
y <- many1 digit
|
||||
char '/'
|
||||
m <- many1 digit
|
||||
@ -247,12 +247,9 @@ ledgerday = do
|
||||
many spacenonewline
|
||||
return (fromGregorian (read y) (read m) (read d))
|
||||
|
||||
ledgerdate :: Parser Date
|
||||
ledgerdate = fmap mkDate ledgerday
|
||||
|
||||
ledgerdatetime :: Parser DateTime
|
||||
ledgerdatetime :: Parser UTCTime
|
||||
ledgerdatetime = do
|
||||
day <- ledgerday
|
||||
day <- ledgerdate
|
||||
h <- many1 digit
|
||||
char ':'
|
||||
m <- many1 digit
|
||||
@ -260,7 +257,7 @@ ledgerdatetime = do
|
||||
char ':'
|
||||
many1 digit
|
||||
many spacenonewline
|
||||
return (mkDateTime day (TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s)))
|
||||
return $ mkUTCTime day (TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s))
|
||||
|
||||
|
||||
ledgerstatus :: Parser Bool
|
||||
|
@ -43,7 +43,7 @@ rawLedgerAccountNameTree l = accountNameTreeFrom $ rawLedgerAccountNames l
|
||||
-- | Remove ledger entries we are not interested in.
|
||||
-- Keep only those which fall between the begin and end dates, and match
|
||||
-- the description pattern, and are cleared or real if those options are active.
|
||||
filterRawLedger :: Maybe Date -> Maybe Date -> [String] -> Bool -> Bool -> RawLedger -> RawLedger
|
||||
filterRawLedger :: Maybe Day -> Maybe Day -> [String] -> Bool -> Bool -> RawLedger -> RawLedger
|
||||
filterRawLedger begin end pats clearedonly realonly =
|
||||
filterRawLedgerTransactionsByRealness realonly .
|
||||
filterRawLedgerEntriesByClearedStatus clearedonly .
|
||||
@ -59,7 +59,7 @@ filterRawLedgerEntriesByDescription pats (RawLedger ms ps es f) =
|
||||
-- | Keep only entries which fall between begin and end dates.
|
||||
-- We include entries on the begin date and exclude entries on the end
|
||||
-- date, like ledger. An empty date string means no restriction.
|
||||
filterRawLedgerEntriesByDate :: Maybe Date -> Maybe Date -> RawLedger -> RawLedger
|
||||
filterRawLedgerEntriesByDate :: Maybe Day -> Maybe Day -> RawLedger -> RawLedger
|
||||
filterRawLedgerEntriesByDate begin end (RawLedger ms ps es f) =
|
||||
RawLedger ms ps (filter matchdate es) f
|
||||
where
|
||||
|
@ -53,8 +53,8 @@ entryFromTimeLogInOut i o =
|
||||
}
|
||||
where
|
||||
acctname = tlcomment i
|
||||
indate = datetimeToDate intime
|
||||
outdate = datetimeToDate outtime
|
||||
indate = utctDay intime
|
||||
outdate = utctDay outtime
|
||||
intime = tldatetime i
|
||||
outtime = tldatetime o
|
||||
amount = Mixed [hours $ elapsedSeconds outtime intime / 3600]
|
||||
|
@ -12,8 +12,6 @@ import Ledger.Utils
|
||||
import qualified Data.Map as Map
|
||||
|
||||
|
||||
newtype Date = Date UTCTime deriving (Ord, Eq)
|
||||
newtype DateTime = DateTime UTCTime deriving (Ord, Eq)
|
||||
type SmartDate = (String,String,String)
|
||||
|
||||
type AccountName = String
|
||||
@ -61,7 +59,7 @@ data PeriodicEntry = PeriodicEntry {
|
||||
} deriving (Eq)
|
||||
|
||||
data Entry = Entry {
|
||||
edate :: Date,
|
||||
edate :: Day,
|
||||
estatus :: Bool,
|
||||
ecode :: String,
|
||||
edescription :: String,
|
||||
@ -79,7 +77,7 @@ data RawLedger = RawLedger {
|
||||
|
||||
data TimeLogEntry = TimeLogEntry {
|
||||
tlcode :: Char,
|
||||
tldatetime :: DateTime,
|
||||
tldatetime :: UTCTime,
|
||||
tlcomment :: String
|
||||
} deriving (Eq,Ord)
|
||||
|
||||
@ -89,7 +87,7 @@ data TimeLog = TimeLog {
|
||||
|
||||
data Transaction = Transaction {
|
||||
entryno :: Int,
|
||||
date :: Date,
|
||||
date :: Day,
|
||||
description :: String,
|
||||
account :: AccountName,
|
||||
amount :: MixedAmount,
|
||||
|
@ -125,7 +125,7 @@ tildeExpand ('~':'/':xs) = getHomeDirectory >>= return . (++ ('/':xs))
|
||||
tildeExpand xs = return xs
|
||||
|
||||
-- | Get the value of the begin date option, if any.
|
||||
beginDateFromOpts :: [Opt] -> Maybe Date
|
||||
beginDateFromOpts :: [Opt] -> Maybe Day
|
||||
beginDateFromOpts opts =
|
||||
if null beginopts
|
||||
then Nothing
|
||||
@ -138,7 +138,7 @@ beginDateFromOpts opts =
|
||||
(y,m,d) = fromparse $ parsewith smartdate $ last beginopts
|
||||
|
||||
-- | Get the value of the end date option, if any.
|
||||
endDateFromOpts :: [Opt] -> Maybe Date
|
||||
endDateFromOpts :: [Opt] -> Maybe Day
|
||||
endDateFromOpts opts =
|
||||
if null endopts
|
||||
then Nothing
|
||||
|
@ -49,7 +49,7 @@ showRegisterReport opts args l = showtxns ts nulltxn nullmixedamt
|
||||
showtxn omitdesc t b = concatBottomPadded [entrydesc ++ txn ++ " ", bal] ++ "\n"
|
||||
where
|
||||
entrydesc = if omitdesc then replicate 32 ' ' else printf "%s %s " date desc
|
||||
date = show $ da
|
||||
date = showDate $ da
|
||||
desc = printf "%-20s" $ elideRight 20 de :: String
|
||||
txn = showRawTransaction $ RawTransaction a amt "" tt
|
||||
bal = padleft 12 (showMixedAmountOrZero b)
|
||||
|
Loading…
Reference in New Issue
Block a user