--- a/Date.st Sun Mar 21 19:37:43 2010 +0000
+++ b/Date.st Thu Apr 08 18:25:02 2010 +0100
@@ -83,7 +83,7 @@
"read the language specific names."
|enDayNames enDayAbbrevs enMonthNames enMonthAbbrevs
- enDefaultFormat enLongFormat enShortFormat deMonthAbbrevs|
+ enDefaultFormat enLongFormat enShortFormat |
DayNames := Dictionary new.
DayAbbrevs := Dictionary new.
@@ -135,37 +135,45 @@
'nov'
'dec').
- deMonthAbbrevs := #('jan'
- 'feb'
- 'mar'
- 'apr'
- 'may'
- 'jun'
- 'jul'
- 'aug'
- 'sep'
- 'oct'
- 'nov'
- 'dez').
-
DayNames at:#'en' put:enDayNames.
DayAbbrevs at:#'en' put:enDayAbbrevs.
MonthNames at:#'en' put:enMonthNames.
MonthAbbrevs at:#'en' put:enMonthAbbrevs.
- MonthAbbrevs at:#'de' put:deMonthAbbrevs.
DefaultFormats at:#'en' put:(enDefaultFormat := '%d-%m-%y').
ShortFormats at:#'en' put:(enShortFormat := '%d-%m-%y').
LongFormats at:#'en' put:(enLongFormat := '%(dayName), %d-%m-%y').
+
"/ take the "master" language here, for the caching
EnvironmentChange := (Smalltalk language asSymbol ~~ #'en').
"
+ Date initDefaultNames
+ "
+!
+
+initNames
+ "read the language specific names."
+
+ |lang|
+
+ DayNames isNil ifTrue:[
+ self initDefaultNames.
+ ].
+
+ lang := Smalltalk language asSymbol.
+ lang ~~ #'en' ifTrue:[
+ self initNamesForLanguage: lang.
+ ].
+
+ EnvironmentChange := false
+
+ "
Date initNames
"
!
-initNames
+initNamesForLanguage:language
"read the language specific names."
|resources lang
@@ -176,9 +184,10 @@
self initDefaultNames.
].
- lang := Smalltalk language asSymbol.
+ lang := language asSymbol.
lang ~~ #'en' ifTrue:[
- ResourcePack notNil ifTrue:[
+ resources := ResourcePack forPackage:'stx:libbasic' resourceFileName: language,'.rs' cached:false .
+ resources notNil ifTrue:[
enDayNames := DayNames at:#'en'.
enDayAbbrevs := DayAbbrevs at:#'en'.
enMonthNames := MonthNames at:#'en'.
@@ -190,30 +199,27 @@
enShortFormat := ShortFormats at:#'en'.
enLongFormat := LongFormats at:#'en'.
- resources := ResourcePack forPackage:(self package).
- resources notNil ifTrue:[
- DefaultFormats at:lang put:(resources at:'DATEFORMAT' default:enDefaultFormat).
- ShortFormats at:lang put:(resources at:'SHORTDATEFORMAT' default:enShortFormat).
- LongFormats at:lang put:(resources at:'LONGDATEFORMAT' default:enLongFormat).
-
- DayNames at:lang put:(resources array:enDayNames).
- DayAbbrevs at:lang put:(resources array:enDayAbbrevs).
- MonthNames at:lang put:(resources array:enMonthNames).
- MonthAbbrevs at:lang put:(resources array:monthAbbrevKeys).
- "/ may needs special care (same key for long and short name)
- may := resources string:'MAY_ABBREV' default:nil.
- may isNil ifTrue:[
- may := resources string:'may'.
- ].
- (MonthAbbrevs at:lang) at:5 put:may.
+ DefaultFormats at:lang put:(resources at:'DATEFORMAT' default:enDefaultFormat).
+ ShortFormats at:lang put:(resources at:'SHORTDATEFORMAT' default:enShortFormat).
+ LongFormats at:lang put:(resources at:'LONGDATEFORMAT' default:enLongFormat).
+
+ DayNames at:lang put:(resources array:enDayNames).
+ DayAbbrevs at:lang put:(resources array:enDayAbbrevs).
+ MonthNames at:lang put:(resources array:enMonthNames).
+ MonthAbbrevs at:lang put:(resources array:monthAbbrevKeys).
+ "/ may needs special care (same key for long and short name)
+ may := resources string:'MAY_ABBREV' default:nil.
+ may isNil ifTrue:[
+ may := resources string:'may'.
].
+ (MonthAbbrevs at:lang) at:5 put:may.
].
].
- EnvironmentChange := false
-
"
- Date initNames
+ Date initNamesForLanguage:#de.
+ Date initNamesForLanguage:#fr.
+ Date initNamesForLanguage:#es.
"
!
@@ -444,6 +450,11 @@
Date readFrom:'5:12:1999' printFormat:#( 2 1 3 )
Date readFrom:'may-12-1999' printFormat:#( 2 1 3 )
Date readFrom:'1999 may 12' printFormat:#( 3 2 1 )
+ Date readFrom:'12/31/2001' printFormat:#( 2 1 3 )
+ Date readFrom:' 31.08.2001' printFormat:#( 1 2 3 )
+ Date readFrom:' 31.dec.2001' printFormat:#( 1 2 3 )
+ Date readFrom:' 31.Dec.2001' printFormat:#( 1 2 3 )
+ Date readFrom:' 31.dez.2001' printFormat:#( 1 2 3 )
Date readFrom:'31/12/01' printFormat:'%d %m %y' onError:'fail'
Date readFrom:'12/01' printFormat:'%m %y' onError:'fail'
@@ -462,7 +473,10 @@
2 month position (1..3)
3 year position (1..3)
or a formatString (see printing instance protocol).
- For now, only %d, %m and %y are supported in the formatString.
+ For now %d, %m, %monthName, %shortMonthName and %y are supported in the formatString.
+ The formatString can have any of these characters '-.:,;/' as separator.
+ The formatString can also use a space as separator (for ex. '%d %m %y') and any separator will be allowed.
+ However, when a character separator is defined, only that separator will be expected.
TODO: make this a general feature of all DateAndTime classes.
"
@@ -506,7 +520,7 @@
sel := sel , (formatStream throughAnyForWhich:[:ch | ch isLetter])
]
].
- somePartAssoc := self readDatePartFrom:str format:sel language:nil.
+ somePartAssoc := self readDatePartFrom:str format:sel language:languageOrNil.
somePartAssoc key == #day ifTrue:[
day := somePartAssoc value.
] ifFalse:[
@@ -522,7 +536,9 @@
]
] ifFalse:[
fc == Character space ifTrue:[
- [(c := str peek) isSeparator or:[ '-.:,;/' includes:c ] ] whileTrue:[ str next ].
+ "/ Skip most possible separator characters
+ "/ (if not enought, should check for isNationalAlphaNumeric instead)
+ [(c := str peek) isSeparator or:[ '-.:,;/\|?<>[]{}()#@!!$&^+=~*_"`' includes:c ] ] whileTrue:[ str next ].
] ifFalse:[
str skipSeparators.
str next == fc ifFalse:[^ exceptionBlock value].
@@ -564,7 +580,17 @@
Date readFrom:'31/12/01' printFormat:'%d %m %y' onError:'fail'
Date readFrom:'12/01' printFormat:'%m %y' onError:'fail'
Date readFrom:'01' printFormat:'%y' onError:'fail'
- Date readFrom:'30.01' printFormat:'%d %m' onError:'fail'
+ Date readFrom:'30.01' printFormat:'%d %m' onError:'fail'
+
+ Date readFrom:'3-3-1995' printFormat:'%d %m %y' language: #de onError:'fail'
+ Date readFrom:'3-März-1995' printFormat:'%d %monthName %y' language: #de onError:'fail'
+ Date readFrom:'3-mär-1995' printFormat:'%d %shortMonthName %y' language: #de onError:'fail'
+ Date readFrom:'3/mär/1995' printFormat:'%d %shortMonthName %y' language: #de onError:'fail'
+ Date readFrom:'3/mär/1995' printFormat:'%d-%shortMonthName-%y' language: #de onError:'fail'
+ Date readFrom:'3-dez-1995' printFormat:'%d %shortMonthName %y' language: #de onError:'fail'
+ Date readFrom:'3-Dez-1995' printFormat:'%d %shortMonthName %y' language: #de onError:'fail'
+ Date readFrom:'3-Dezember-1995' printFormat:'%d %monthName %y' language: #de onError:'fail'
+
"
"Created: 16.11.1995 / 22:50:17 / cg"
@@ -1333,48 +1359,78 @@
!Date class methodsFor:'private'!
abbreviatedMonthNamesForLanguage:language
- |langMonthAbbrevs|
+ |langMonthAbbrevs lang|
(MonthAbbrevs isNil or:[EnvironmentChange]) ifTrue:[
self initNames
].
- langMonthAbbrevs := MonthAbbrevs at:(language ? Smalltalk language) ifAbsent:nil.
- langMonthAbbrevs isNil ifTrue:[
- langMonthAbbrevs := MonthAbbrevs at:#en.
+ lang := language ? Smalltalk language.
+ langMonthAbbrevs := MonthAbbrevs at:lang ifAbsent:nil.
+
+ "/ If language is not found, try to initialize it from the resources and try again
+ langMonthAbbrevs isNil ifTrue:[
+ self initNamesForLanguage: lang.
+ "/ If language initialization failed, take english monthAbbrevs
+ langMonthAbbrevs := MonthAbbrevs at:lang ifAbsent:[MonthAbbrevs at:#en.].
].
^ langMonthAbbrevs
"
self abbreviatedMonthNamesForLanguage:#en
self abbreviatedMonthNamesForLanguage:#de
+ self abbreviatedMonthNamesForLanguage:#fr
self abbreviatedMonthNamesForLanguage:#es
"
!
dayAbbrevsForLanguage:language
- |langDayAbbrevs|
+ |langDayAbbrevs lang|
(DayAbbrevs isNil or:[EnvironmentChange]) ifTrue:[
self initNames
].
- langDayAbbrevs := DayAbbrevs at:(language ? Smalltalk language) ifAbsent:nil.
- langDayAbbrevs isNil ifTrue:[
- langDayAbbrevs := DayAbbrevs at:#en.
+ lang := language ? Smalltalk language.
+ langDayAbbrevs := DayAbbrevs at:lang ifAbsent:nil.
+
+ "/ If language is not found, try to initialize it from the resources and try again
+ langDayAbbrevs isNil ifTrue:[
+ self initNamesForLanguage: lang.
+ "/ If language initialization failed, take english dayAbbrevs
+ langDayAbbrevs := DayAbbrevs at:lang ifAbsent:[DayAbbrevs at:#en.].
].
^ langDayAbbrevs
+
+ "
+ self dayAbbrevsForLanguage:#en
+ self dayAbbrevsForLanguage:#de
+ self dayAbbrevsForLanguage:#fr
+ self dayAbbrevsForLanguage:#es
+ "
!
dayNamesForLanguage:language
- |langDayNames|
+ |langDayNames lang|
(DayNames isNil or:[EnvironmentChange]) ifTrue:[
self initNames
].
- langDayNames := DayNames at:(language ? Smalltalk language) ifAbsent:nil.
- langDayNames isNil ifTrue:[
- langDayNames := DayNames at:#en.
+ lang := language ? Smalltalk language.
+ langDayNames := DayNames at:lang ifAbsent:nil.
+
+ "/ If language is not found, try to initialize it from the resources and try again
+ langDayNames isNil ifTrue:[
+ self initNamesForLanguage: lang.
+ "/ If language initialization failed, take english dayNames
+ langDayNames := DayNames at:lang ifAbsent:[DayNames at:#en].
].
^ langDayNames
+
+ "
+ self dayNamesForLanguage:#en
+ self dayNamesForLanguage:#de
+ self dayNamesForLanguage:#fr
+ self dayNamesForLanguage:#es
+ "
!
daysInMonthIndex: monthIndex forYear: yearInteger
@@ -1452,14 +1508,19 @@
!
monthNamesForLanguage:language
- |langMonthNames|
+ |langMonthNames lang|
(MonthNames isNil or:[EnvironmentChange]) ifTrue:[
self initNames
].
- langMonthNames := MonthNames at:(language ? Smalltalk language) ifAbsent:nil.
- langMonthNames isNil ifTrue:[
- langMonthNames := MonthNames at:#en.
+ lang := language ? Smalltalk language.
+ langMonthNames := MonthNames at:lang ifAbsent:nil.
+
+ "/ If language is not found, try to initialize it from the resources and try again
+ langMonthNames isNil ifTrue:[
+ self initNamesForLanguage: lang.
+ "/ If language initialization failed, take english monthNames
+ langMonthNames := MonthNames at:lang ifAbsent:[MonthNames at:#en.].
].
^ langMonthNames
! !
@@ -1476,48 +1537,52 @@
readDatePartFrom:str format:fmt language:languageOrNil
"read a single component (such as %shortName) from str"
- |dayName monthName day month year|
-
- ((fmt sameAs:'dayName') or:[fmt sameAs:'shortDayName']) ifTrue:[
+ |dayName monthName day month year format string |
+
+ format := fmt.
+ string := str throughAnyForWhich:[:ch | ch isNationalAlphaNumeric].
+
+ ((format sameAs:'dayName') or:[format sameAs:'shortDayName']) ifTrue:[
"/ skipped, in case the format is 'monday, 23rd of may...' - not used for decoding
- dayName := str nextWord.
+ dayName := string.
^ nil.
].
-
- (fmt sameAs:'d') ifTrue:[
- day := Integer readFrom:str.
+ (format sameAs:'d') ifTrue:[
+ day := Integer readFrom:string.
^ #day -> day
].
- (fmt sameAs:'m') ifTrue:[
- month := Integer readFrom:str.
+
+ (format sameAs:'m') ifTrue:[
+ month := Integer readFrom:string.
^ #month -> month
].
- fmt = 'y' ifTrue:[
- year := Integer readFrom:str.
+ (format sameAs:'monthName') ifTrue:[
+ monthName := string.
+ month := (Date monthNamesForLanguage:languageOrNil) findFirst:[:m | monthName sameAs:m].
+"/ month == 0 ifTrue:[self error:'invalid month name'].
+ ^ #month -> month
+ ].
+ (format sameAs:'shortMonthName') ifTrue:[
+ monthName := string.
+ month := (Date abbreviatedMonthNamesForLanguage:languageOrNil) findFirst:[:m | monthName sameAs:m].
+"/ month == 0 ifTrue:[self error:'invalid month name'].
+ ^ #month -> month
+ ].
+
+ format = 'y' ifTrue:[
+ year := Integer readFrom:string.
year < 100 ifTrue:[
^ #year -> (year + 2000)
].
^ #year -> year
].
- fmt = 'Y' ifTrue:[
- year := Integer readFrom:str.
+ format = 'Y' ifTrue:[
+ year := Integer readFrom:string.
year >= 100 ifTrue:[
^ #year -> year
].
^ #year -> (year + 2000)
].
- (fmt sameAs:'monthName') ifTrue:[
- monthName := str nextWord.
- month := (Date monthNamesForLanguage:languageOrNil) findFirst:[:m | monthName sameAs:m].
- month == 0 ifTrue:[self error:'invalid month name'].
- ^ #month -> month
- ].
- (fmt sameAs:'shortMonthName') ifTrue:[
- monthName := str nextWord.
- month := (Date abbreviatedMonthNamesForLanguage:languageOrNil) findFirst:[:m | monthName sameAs:m].
- month == 0 ifTrue:[self error:'invalid month name'].
- ^ #month -> month
- ].
self error:'unknown format specifier'
! !
@@ -2475,9 +2540,7 @@
"the argument must understand year, month and day to be
comparable, whatever it is"
- ^ dateEncoding < (Date encodeYear:aDate year
- month:aDate month
- day:aDate day)
+ ^ dateEncoding < (Date encodeYear:aDate year month:aDate month day:aDate day)
"
Date today < (Date day:24 month:12 year:2000)
@@ -2517,9 +2580,7 @@
"the argument must understand year, month and day to be
comparable, whatever it is"
- ^ dateEncoding > (Date encodeYear:aDate year
- month:aDate month
- day:aDate day)
+ ^ dateEncoding > (Date encodeYear:aDate year month:aDate month day:aDate day)
"
Date today > (Date newDay:24 month:12 year:2099)
@@ -2543,11 +2604,6 @@
^ self
!
-asNative
- #swAdded.
- ^self
-!
-
asTimestamp
"return an TimeStamp instance, representing midnight of last night"
@@ -2618,32 +2674,6 @@
^ self addDays:days
! !
-!Date methodsFor:'printing'!
-
-printUnboundedSchemaStringOn: stream
- "If a Date is prior to 01 January 1601, or post 31 December 65535, then it cannot be
- formatted by Windows. ... and the Dolphin printUnboundedDate method does not respect the format string"
-
- #swAdded.
- stream
- display: self year;
- nextPut: $-;
- display: (self monthIndex printStringRadix: 10 padTo: 2);
- nextPut: $-;
- display: (self dayOfMonth printStringRadix: 10 padTo: 2).
-!
-
-schemaDisplayString
- "Answer a valid XMLSchema xsd:date lexical representation"
- "Assume UTC"
-
- | stream |
- #swAdded.
- stream := String writeStream.
- self printUnboundedSchemaStringOn: stream.
- stream nextPut: $Z.
- ^stream contents
-! !
!Date methodsFor:'printing & storing'!
@@ -2987,11 +3017,11 @@
!Date class methodsFor:'documentation'!
version
- ^ '$Id: Date.st 10501 2010-02-13 23:34:44Z vranyj1 $'
+ ^ '$Id: Date.st 10510 2010-04-08 17:25:02Z vranyj1 $'
!
version_CVS
- ^ '§Header: /cvs/stx/stx/libbasic/Date.st,v 1.132 2010/02/10 17:46:21 cg Exp §'
+ ^ '§Header: /cvs/stx/stx/libbasic/Date.st,v 1.135 2010/03/26 14:26:26 fm Exp §'
! !
Date initialize!
@@ -3000,3 +3030,4 @@
+