Date.st
branchjv
changeset 17757 73caeb68bf1f
parent 17751 b2273fa8d59f
child 17761 b0e5971141bc
--- 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 @@
 
 
 
+