[ 
https://issues.apache.org/jira/browse/FLEX-20017?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Justin Mclean updated FLEX-20017:
---------------------------------

    Labels: easyfix easytest  (was: )
    
> DateFormatter MMM & MMMM return month of by 1
> ---------------------------------------------
>
>                 Key: FLEX-20017
>                 URL: https://issues.apache.org/jira/browse/FLEX-20017
>             Project: Apache Flex
>          Issue Type: Bug
>          Components: Formatters
>    Affects Versions: Adobe Flex SDK 3.2 (Release)
>         Environment: Affected OS(s): All OS Platforms
> Affected OS(s): All OS Platforms
> Language Found: English
>            Reporter: Adobe JIRA
>              Labels: easyfix, easytest
>
> var df:DateFormatter = new DateFormatter();
> df.formatString = "DD MMM YY"
> trace(df.format(new Date(2000,1,1)))
> You get 01 Feb 00 when you should get 01 Jan 00
> The problem is in DateBase.extractTokenDate()
> It looks up DateBase.monthNamesShort|monthNamesLong[month] when month is 1 
> based, not zero based like the array.
> The case where (key < 3) realises this, and does month++
> I'm using the Eclipse Plugin on MacOS.
> This patch fixes it (use it in place of DateFormatter) 
> package
> {
>       import mx.formatters.DateFormatter;
> import mx.core.mx_internal;
> import mx.managers.ISystemManager;
> import mx.managers.SystemManager;
> import mx.formatters.DateBase;
> import mx.formatters.StringFormatter;
>       
>       public class DateFormatterPatched extends DateFormatter
>       {
>               
>               private static const VALID_PATTERN_CHARS:String = 
> "Y,M,D,A,E,H,J,K,L,N,S";
>               
>               public function DateFormatterPatched()
>               {
>                       super();
>               }
>               
>                       mx_internal static function extractTokenDate(date:Date,
>                                                                               
>         tokenInfo:Object):String
>       {
>               //initialize();
>               //var result:String = "";
>               
>               var key:int = int(tokenInfo.end) - int(tokenInfo.begin);
>               
>               //var day:int;
>               //var hours:int;
>               
>               switch (tokenInfo.token) {
>                       case "M":
>                       {
>                               // month in year
>                               var month:int = int(date.getMonth());
>                               if (key < 3)
>                               {
>                                       return 
> DateBase.mx_internal::extractTokenDate(date,tokenInfo)                        
>    
>                               }
>                               else if (key == 3)
>                               {
>                                       return 
> DateBase.monthNamesShort[month-1];
>                               }
>                               else
>                               {
>                                       return DateBase.monthNamesLong[month-1];
>                               }
>                       }
>               }
>               return DateBase.mx_internal::extractTokenDate(date,tokenInfo)
>       }
>               
>     override public function format(value:Object):String
>     {       
>         // Reset any previous errors.
>         if (error)
>             error = null;
>         // If value is null, or empty String just return "" 
>         // but treat it as an error for consistency.
>         // Users will ignore it anyway.
>         if (!value || value == "")
>         {
>             error = defaultInvalidValueError;
>             return "";
>         }
>         // -- value --
>         if (value is String)
>         {
>             value = DateFormatter.parseDateString(String(value));
>             if (!value)
>             {
>                 error = defaultInvalidValueError;
>                 return "";
>             }
>         }
>         else if (!(value is Date))
>         {
>             error = defaultInvalidValueError;
>             return "";
>         }
>         // -- format --
>         var letter:String;
>         var nTokens:int = 0;
>         var tokens:String = "";
>         
>         var n:int = formatString.length;
>         for (var i:int = 0; i < n; i++)
>         {
>             letter = formatString.charAt(i);
>             if (VALID_PATTERN_CHARS.indexOf(letter) != -1 && letter != ",")
>             {
>                 nTokens++;
>                 if (tokens.indexOf(letter) == -1)
>                 {
>                     tokens += letter;
>                 }
>                 else
>                 {
>                     if (letter != formatString.charAt(Math.max(i - 1, 0)))
>                     {
>                         error = defaultInvalidFormatError;
>                         return "";
>                     }
>                 } 
>             }
>         }
>         if (nTokens < 1)
>         {
>             error = defaultInvalidFormatError;
>             return "";
>         }
>         var dataFormatter:StringFormatter = new StringFormatter(
>             formatString, VALID_PATTERN_CHARS,
>             DateFormatterPatched.mx_internal::extractTokenDate);
>             //DateBase.mx_internal::extractTokenDate);
>         return dataFormatter.formatValue(value);
>     }
>       }
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to