parse timelog entries according to a timezone stored in the context
This commit is contained in:
		
							parent
							
								
									44cbed59cb
								
							
						
					
					
						commit
						25526cf4b3
					
				| @ -39,9 +39,6 @@ import Ledger.Utils | ||||
| showDate :: Day -> String | ||||
| showDate d = formatTime defaultTimeLocale "%Y/%m/%d" d | ||||
| 
 | ||||
| mkUTCTime :: Day -> TimeOfDay -> UTCTime | ||||
| mkUTCTime day tod = localTimeToUTC utc (LocalTime day tod) | ||||
| 
 | ||||
| getCurrentDay :: IO Day | ||||
| getCurrentDay = do | ||||
|     t <- getZonedTime | ||||
|  | ||||
| @ -16,6 +16,8 @@ import qualified Text.ParserCombinators.Parsec.Token as P | ||||
| import System.Directory | ||||
| import System.IO | ||||
| import qualified Data.Map as Map | ||||
| import Data.Time.LocalTime | ||||
| import Data.Time.Calendar | ||||
| import Ledger.Utils | ||||
| import Ledger.Types | ||||
| import Ledger.Dates | ||||
| @ -24,21 +26,20 @@ import Ledger.Entry | ||||
| import Ledger.Commodity | ||||
| import Ledger.TimeLog | ||||
| import Ledger.RawLedger | ||||
| import Data.Time.LocalTime | ||||
| import Data.Time.Calendar | ||||
| 
 | ||||
| 
 | ||||
| -- utils | ||||
| 
 | ||||
| -- | Some context kept during parsing. | ||||
| data LedgerFileCtx = Ctx { | ||||
|       ctxYear    :: !(Maybe Integer)  -- ^ the current default year specified with Y, if any | ||||
|       ctxTimeZone :: !TimeZone         -- ^ the user's timezone | ||||
|     , ctxYear     :: !(Maybe Integer)  -- ^ the default year most recently specified with Y | ||||
|     , ctxCommod   :: !(Maybe String)   -- ^ I don't know | ||||
|     , ctxAccount :: ![String]         -- ^ the current "container" account specified with !account, if any | ||||
|     , ctxAccount  :: ![String]         -- ^ the current stack of "container" accounts specified by !account | ||||
|     } deriving (Read, Show) | ||||
| 
 | ||||
| emptyCtx :: LedgerFileCtx | ||||
| emptyCtx = Ctx { ctxYear = Nothing, ctxCommod = Nothing, ctxAccount = [] } | ||||
| emptyCtx = Ctx { ctxTimeZone=utc, ctxYear=Nothing, ctxCommod=Nothing, ctxAccount=[] } | ||||
| 
 | ||||
| -- containing accounts "nest" hierarchically | ||||
| 
 | ||||
| @ -62,6 +63,12 @@ setYear y = updateState (\ctx -> ctx{ctxYear=Just y}) | ||||
| getYear :: GenParser tok LedgerFileCtx (Maybe Integer) | ||||
| getYear = liftM ctxYear getState | ||||
| 
 | ||||
| setTimeZone :: TimeZone -> GenParser tok LedgerFileCtx () | ||||
| setTimeZone tz = updateState (\ctx -> ctx{ctxTimeZone=tz}) | ||||
| 
 | ||||
| getCtxTimeZone :: GenParser tok LedgerFileCtx TimeZone | ||||
| getCtxTimeZone = liftM ctxTimeZone getState | ||||
| 
 | ||||
| -- let's get to it | ||||
| 
 | ||||
| parseLedgerFile :: FilePath -> ErrorT String IO RawLedger | ||||
| @ -326,7 +333,7 @@ ledgerpartialdate = do | ||||
|   when (y==Nothing) $ error "partial date found, but no default year specified" | ||||
|   return $ fromGregorian (fromJust y) (read m) (read d) | ||||
| 
 | ||||
| ledgerdatetime :: GenParser Char st UTCTime | ||||
| ledgerdatetime :: GenParser Char LedgerFileCtx UTCTime | ||||
| ledgerdatetime = do  | ||||
|   day <- ledgerdate | ||||
|   h <- many1 digit | ||||
| @ -336,8 +343,9 @@ ledgerdatetime = do | ||||
|       char ':' | ||||
|       many1 digit | ||||
|   many spacenonewline | ||||
|   return $ mkUTCTime day (TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s)) | ||||
| 
 | ||||
|   let tod = TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s) | ||||
|   tz <- getCtxTimeZone | ||||
|   return $ localTimeToUTC tz (LocalTime day tod) | ||||
| 
 | ||||
| ledgerstatus :: GenParser Char st Bool | ||||
| ledgerstatus = try (do { char '*'; many1 spacenonewline; return True } ) <|> return False | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user