this/next/last day/week
This commit is contained in:
		
							parent
							
								
									884ebf2979
								
							
						
					
					
						commit
						7858ed1327
					
				| @ -16,6 +16,9 @@ where | |||||||
| import Data.Time.Clock | import Data.Time.Clock | ||||||
| import Data.Time.Format | import Data.Time.Format | ||||||
| import Data.Time.Calendar | import Data.Time.Calendar | ||||||
|  | import Data.Time.Calendar.MonthDay | ||||||
|  | import Data.Time.Calendar.OrdinalDate | ||||||
|  | import Data.Time.Calendar.WeekDate | ||||||
| import Data.Time.LocalTime | import Data.Time.LocalTime | ||||||
| import System.Locale (defaultTimeLocale) | import System.Locale (defaultTimeLocale) | ||||||
| import Text.Printf | import Text.Printf | ||||||
| @ -82,11 +85,11 @@ fixSmartDate refdate sdate = mkDate $ fromGregorian y m d | |||||||
|       fix :: SmartDate -> (Integer,Int,Int) |       fix :: SmartDate -> (Integer,Int,Int) | ||||||
|       fix ("","","today")     = (ry, rm, rd) |       fix ("","","today")     = (ry, rm, rd) | ||||||
|       fix ("","this","day")   = (ry, rm, rd) |       fix ("","this","day")   = (ry, rm, rd) | ||||||
|       fix ("","","yesterday") = dateComponents $ lastday refdate |       fix ("","","yesterday") = dateComponents $ prevday refdate | ||||||
|       fix ("","last","day")   = dateComponents $ lastday refdate |       fix ("","last","day")   = dateComponents $ prevday refdate | ||||||
|       fix ("","","tomorrow")  = dateComponents $ nextday refdate |       fix ("","","tomorrow")  = dateComponents $ nextday refdate | ||||||
|       fix ("","next","day")   = dateComponents $ nextday refdate |       fix ("","next","day")   = dateComponents $ nextday refdate | ||||||
|       fix ("","last","week")  = dateComponents $ lastweek refdate |       fix ("","last","week")  = dateComponents $ prevweek refdate | ||||||
|       fix ("","this","week")  = dateComponents $ thisweek refdate |       fix ("","this","week")  = dateComponents $ thisweek refdate | ||||||
|       fix ("","next","week")  = dateComponents $ nextweek refdate |       fix ("","next","week")  = dateComponents $ nextweek refdate | ||||||
|       fix ("","",d)           = (ry, rm, read d) |       fix ("","",d)           = (ry, rm, read d) | ||||||
| @ -94,12 +97,20 @@ fixSmartDate refdate sdate = mkDate $ fromGregorian y m d | |||||||
|       fix (y,m,d)             = (read y, read m, read d) |       fix (y,m,d)             = (read y, read m, read d) | ||||||
|       (ry,rm,rd) = dateComponents refdate |       (ry,rm,rd) = dateComponents refdate | ||||||
| 
 | 
 | ||||||
| lastday, nextday :: Date -> Date | prevday, nextday :: Date -> Date | ||||||
| lastday = mkDate . (addDays (-1)) . utctDay . dateToUTC | prevday = mkDate . (addDays (-1)) . utctDay . dateToUTC | ||||||
| nextday = mkDate . (addDays 1) . utctDay . dateToUTC | nextday = mkDate . (addDays 1) . utctDay . dateToUTC | ||||||
| lastweek = mkDate . (addDays (-7)) . utctDay . dateToUTC | thisweek date = mkDate $ mondayofweekcontaining $ utctDay $ dateToUTC date | ||||||
| thisweek = mkDate . (addDays 0) . utctDay . dateToUTC | prevweek date = mkDate $ mondayofweekbefore $ utctDay $ dateToUTC date | ||||||
| nextweek = mkDate . (addDays 7) . utctDay . dateToUTC | nextweek date = mkDate $ mondayafter $ utctDay $ dateToUTC date | ||||||
|  | 
 | ||||||
|  | mondayafter day = mondayofweekcontaining $ addDays 7 day | ||||||
|  | mondayofweekbefore day = mondayofweekcontaining $ addDays (-7) day | ||||||
|  | mondayofweekcontaining day = fromMondayStartWeek y w 1 | ||||||
|  |     where | ||||||
|  |       (y,m,d) = toGregorian day | ||||||
|  |       (w,_) = mondayStartWeek day | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ||||||
| -- parsing | -- parsing | ||||||
| @ -139,8 +150,8 @@ Assumes any text in the parse stream has been lowercased. | |||||||
| -} | -} | ||||||
| smartdate :: Parser SmartDate | smartdate :: Parser SmartDate | ||||||
| smartdate = do | smartdate = do | ||||||
|   let dateparsers = [ymd, ym, md, y, d, month, mon, today', yesterday, tomorrow |   let dateparsers = [ymd, ym, md, y, d, month, mon, today', yesterday, tomorrow, | ||||||
|                      -- lastthisnextthing |                      lastthisnextthing | ||||||
|                     ] |                     ] | ||||||
|   (y,m,d) <- choice $ map try dateparsers |   (y,m,d) <- choice $ map try dateparsers | ||||||
|   return $ (y,m,d) |   return $ (y,m,d) | ||||||
| @ -217,7 +228,8 @@ lastthisnextthing = do | |||||||
|        ,string "this" |        ,string "this" | ||||||
|        ,string "next" |        ,string "next" | ||||||
|       ] |       ] | ||||||
|   many1 spacenonewline |   --many1 spacenonewline | ||||||
|  |   many spacenonewline  -- allow lastweek for easier shell scripting | ||||||
|   p <- choice [ |   p <- choice [ | ||||||
|         string "day" |         string "day" | ||||||
|        ,string "week" |        ,string "week" | ||||||
|  | |||||||
							
								
								
									
										32
									
								
								Tests.hs
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								Tests.hs
									
									
									
									
									
								
							| @ -97,28 +97,28 @@ misc_tests = TestList [ | |||||||
|   "timeLog" ~: do |   "timeLog" ~: do | ||||||
|     assertparseequal timelog1 (parsewith timelog timelog1_str) |     assertparseequal timelog1 (parsewith timelog timelog1_str) | ||||||
|   ,                   |   ,                   | ||||||
|   "smartparsedate"     ~: do |   "smart dates"     ~: do | ||||||
|     t <- today |     let todaysdate = parsedate "2008/11/26" -- wednesday | ||||||
|     let (ty,tm,td) = dateComponents t |     let str `gives` datestr = assertequal datestr (fixSmartDateStr todaysdate str) | ||||||
|     let str `gives` datestr = assertequal datestr (fixSmartDateStr t str) |  | ||||||
|     "1999-12-02" `gives` "1999/12/02" |     "1999-12-02" `gives` "1999/12/02" | ||||||
|     "1999.12.02" `gives` "1999/12/02" |     "1999.12.02" `gives` "1999/12/02" | ||||||
|     "1999/3/2"   `gives` "1999/03/02" |     "1999/3/2"   `gives` "1999/03/02" | ||||||
|     "2008/2"     `gives` "2008/02/01" |     "2008/2"     `gives` "2008/02/01" | ||||||
|     "20/2"       `gives` "0020/02/01" |     "20/2"       `gives` "0020/02/01" | ||||||
|     "1000"       `gives` "1000/01/01" |     "1000"       `gives` "1000/01/01" | ||||||
|     "4/2"        `gives` (printf "%04d/04/02" ty) |     "4/2"        `gives` "2008/04/02" | ||||||
|     "2"          `gives` (printf "%04d/%02d/02" ty tm) |     "2"          `gives` "2008/11/02" | ||||||
|     "January"    `gives` (printf "%04d/01/01" ty) |     "January"    `gives` "2008/01/01" | ||||||
|     "feb"        `gives` (printf "%04d/02/01" ty) |     "feb"        `gives` "2008/02/01" | ||||||
|     "today"      `gives` (printf "%04d/%02d/%02d" ty tm td) |     "today"      `gives` "2008/11/26" | ||||||
| --     "this day"   `gives` (printf "%04d/%02d/%02d" ty tm td) |     "yesterday"  `gives` "2008/11/25" | ||||||
|     let (y,m,d) = toGregorian $ addDays (-1) $ fromGregorian ty tm td |     "tomorrow"   `gives` "2008/11/27" | ||||||
|     "yesterday"  `gives` (printf "%04d/%02d/%02d" y m d) |     "this day"   `gives` "2008/11/26" | ||||||
| --     "last day"   `gives` (printf "%04d/%02d/%02d" y m d) |     "last day"   `gives` "2008/11/25" | ||||||
|     let (y,m,d) = toGregorian $ addDays 1 $ fromGregorian ty tm td |     "next day"   `gives` "2008/11/27" | ||||||
|     "tomorrow"   `gives` (printf "%04d/%02d/%02d" y m d) |     "this week"  `gives` "2008/11/24" -- last monday | ||||||
| --     "next day"   `gives` (printf "%04d/%02d/%02d" y m d) |     "last week"  `gives` "2008/11/17" -- previous monday | ||||||
|  |     "next week"  `gives` "2008/12/01" -- next monday | ||||||
|   ] |   ] | ||||||
| 
 | 
 | ||||||
| balancereportacctnames_tests = TestList  | balancereportacctnames_tests = TestList  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user