<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FDate_Utilities</id>
		<title>Java/GWT/Date Utilities - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FDate_Utilities"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/GWT/Date_Utilities&amp;action=history"/>
		<updated>2026-04-07T02:37:47Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/GWT/Date_Utilities&amp;diff=7047&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/GWT/Date_Utilities&amp;diff=7047&amp;oldid=prev"/>
				<updated>2010-06-01T06:35:34Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:35, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/GWT/Date_Utilities&amp;diff=7046&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/GWT/Date_Utilities&amp;diff=7046&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== A simple regular expression based parser for date notations ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import org.gwtwidgets.client.util.regex.Pattern;&lt;br /&gt;
/**&lt;br /&gt;
 * This is a simple regular expression based parser for date notations.&lt;br /&gt;
 * While our aim is to fully support in the future the JDK date parser, currently&lt;br /&gt;
 * only numeric notations and literals are supported such as &amp;lt;code&amp;gt;dd/MM/yyyy HH:mm:ss.SSSS&amp;lt;/code&amp;gt;.&lt;br /&gt;
 * Each entity is parsed with the same number of digits, i.e. for &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; two digits will be&lt;br /&gt;
 * parsed while for &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; only one will be parsed.&lt;br /&gt;
 * @author &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class SimpleDateParser {&lt;br /&gt;
&lt;br /&gt;
  private final static String DAY_IN_MONTH = &amp;quot;d&amp;quot;;&lt;br /&gt;
  private final static String MONTH = &amp;quot;M&amp;quot;;&lt;br /&gt;
  private final static String YEAR = &amp;quot;y&amp;quot;;&lt;br /&gt;
  private final static String LITERAL = &amp;quot;\\&amp;quot;;&lt;br /&gt;
  private final static int DATE_PATTERN = 0;&lt;br /&gt;
  private final static int REGEX_PATTERN = 1;&lt;br /&gt;
  private final static int COMPONENT = 2;&lt;br /&gt;
  private final static int REGEX = 0;&lt;br /&gt;
  private final static int INSTRUCTION = 1;&lt;br /&gt;
  private final static String[] TOKENS[] = {&lt;br /&gt;
  { &amp;quot;SSSS&amp;quot;, &amp;quot;(\\d\\d\\d\\d)&amp;quot;,DateLocale.TOKEN_MILLISECOND }, &lt;br /&gt;
  { &amp;quot;SSS&amp;quot;, &amp;quot;(\\d\\d\\d)&amp;quot;, DateLocale.TOKEN_MILLISECOND },&lt;br /&gt;
  { &amp;quot;SS&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_MILLISECOND }, &lt;br /&gt;
  { &amp;quot;S&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_MILLISECOND },&lt;br /&gt;
  { &amp;quot;ss&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_SECOND }, &lt;br /&gt;
  { &amp;quot;s&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_SECOND },&lt;br /&gt;
  { &amp;quot;mm&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_MINUTE }, &lt;br /&gt;
  { &amp;quot;m&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_MINUTE},&lt;br /&gt;
  { &amp;quot;HH&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_HOUR_24},&lt;br /&gt;
  { &amp;quot;H&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_HOUR_24 },&lt;br /&gt;
  { &amp;quot;dd&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_DAY_OF_MONTH }, &lt;br /&gt;
  { &amp;quot;d&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_DAY_OF_MONTH },&lt;br /&gt;
  { &amp;quot;MM&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_MONTH }, &lt;br /&gt;
  { &amp;quot;M&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_MONTH },&lt;br /&gt;
  { &amp;quot;yyyy&amp;quot;, &amp;quot;(\\d\\d\\d\\d)&amp;quot;, DateLocale.TOKEN_YEAR }, &lt;br /&gt;
  { &amp;quot;yyy&amp;quot;, &amp;quot;(\\d\\d\\d)&amp;quot;, DateLocale.TOKEN_YEAR },&lt;br /&gt;
  { &amp;quot;yy&amp;quot;, &amp;quot;(\\d\\d)&amp;quot;, DateLocale.TOKEN_YEAR }, &lt;br /&gt;
  { &amp;quot;y&amp;quot;, &amp;quot;(\\d)&amp;quot;, DateLocale.TOKEN_YEAR }&lt;br /&gt;
  };&lt;br /&gt;
  private Pattern regularExpression;;&lt;br /&gt;
  private String instructions = &amp;quot;&amp;quot;;&lt;br /&gt;
  private static void _parse(String format, String[] args) {&lt;br /&gt;
    if (format.length() == 0)&lt;br /&gt;
      return;&lt;br /&gt;
    if (format.startsWith(&amp;quot;&amp;quot;&amp;quot;)){&lt;br /&gt;
      format = format.substring(1);&lt;br /&gt;
      int end = format.indexOf(&amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
      if (end == -1)&lt;br /&gt;
        throw new IllegalArgumentException(&amp;quot;Unmatched single quotes.&amp;quot;);&lt;br /&gt;
      args[REGEX]+=Pattern.quote(format.substring(0,end));&lt;br /&gt;
      format = format.substring(end+1);&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; TOKENS.length; i++) {&lt;br /&gt;
      String[] row = TOKENS[i];&lt;br /&gt;
      String datePattern = row[DATE_PATTERN];&lt;br /&gt;
      if (!format.startsWith(datePattern))&lt;br /&gt;
        continue;&lt;br /&gt;
      format = format.substring(datePattern.length());&lt;br /&gt;
      args[REGEX] += row[REGEX_PATTERN];&lt;br /&gt;
      args[INSTRUCTION] += row[COMPONENT];&lt;br /&gt;
      _parse(format, args);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    args[REGEX] += Pattern.quote(&amp;quot;&amp;quot;+format.charAt(0));&lt;br /&gt;
    format = format.substring(1);&lt;br /&gt;
    _parse(format, args);&lt;br /&gt;
  }&lt;br /&gt;
  private static void load(Date date, String text, String component) {&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_MILLISECOND)) {&lt;br /&gt;
      //TODO: implement&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_SECOND)) {&lt;br /&gt;
      date.setSeconds(Integer.parseInt(text));&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_MINUTE)) {&lt;br /&gt;
      date.setMinutes(Integer.parseInt(text));&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_HOUR_24)) {&lt;br /&gt;
      date.setHours(Integer.parseInt(text));&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_DAY_OF_MONTH)) {&lt;br /&gt;
      date.setDate(Integer.parseInt(text));&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_MONTH)) {&lt;br /&gt;
      date.setMonth(Integer.parseInt(text)-1);&lt;br /&gt;
    }&lt;br /&gt;
    if (component.equals(DateLocale.TOKEN_YEAR)) {&lt;br /&gt;
      //TODO: fix for short patterns&lt;br /&gt;
      date.setYear(Integer.parseInt(text)-1900);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public SimpleDateParser(String format) {&lt;br /&gt;
    String[] args = new String[] { &amp;quot;&amp;quot;, &amp;quot;&amp;quot; };&lt;br /&gt;
    _parse(format, args);&lt;br /&gt;
    regularExpression = new Pattern(args[REGEX]);&lt;br /&gt;
    instructions = args[INSTRUCTION];&lt;br /&gt;
  }&lt;br /&gt;
  public Date parse(String input) {&lt;br /&gt;
    Date date = new Date(0, 0, 0, 0, 0, 0);&lt;br /&gt;
    String matches[] = regularExpression.match(input);&lt;br /&gt;
    if (matches == null)&lt;br /&gt;
      throw new IllegalArgumentException(input+&amp;quot; does not match &amp;quot;+regularExpression.pattern());&lt;br /&gt;
    if (matches.length-1!=instructions.length())&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Different group count - &amp;quot;+input+&amp;quot; does not match &amp;quot;+regularExpression.pattern());&lt;br /&gt;
    for (int group = 0; group &amp;lt; instructions.length(); group++) {&lt;br /&gt;
      String match = matches[group + 1];&lt;br /&gt;
      load(date, match, &amp;quot;&amp;quot;+instructions.charAt(group));&lt;br /&gt;
    }&lt;br /&gt;
    return date;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public static Date parse(String input, String pattern){&lt;br /&gt;
    return new SimpleDateParser(pattern).parse(input);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date locale support for the SimpleDateParser ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
/**&lt;br /&gt;
 * Date locale support for the {@link SimpleDateParser}. You are encouraged to&lt;br /&gt;
 * extend this class and provide implementations for other locales. &lt;br /&gt;
 * @author &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class DateLocale {&lt;br /&gt;
  public final static String TOKEN_DAY_OF_WEEK = &amp;quot;E&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_DAY_OF_MONTH = &amp;quot;d&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_MONTH = &amp;quot;M&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_YEAR = &amp;quot;y&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_HOUR_12 = &amp;quot;h&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_HOUR_24 = &amp;quot;H&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_MINUTE = &amp;quot;m&amp;quot;;&lt;br /&gt;
  public final static String TOKEN_SECOND = &amp;quot;s&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  public final static String TOKEN_MILLISECOND = &amp;quot;S&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  public final static String TOKEN_AM_PM = &amp;quot;a&amp;quot;;&lt;br /&gt;
  public final static String AM = &amp;quot;AM&amp;quot;;&lt;br /&gt;
  public final static String PM = &amp;quot;PM&amp;quot;;&lt;br /&gt;
  public final static List SUPPORTED_DF_TOKENS = Arrays.asList(new String[] {&lt;br /&gt;
          TOKEN_DAY_OF_WEEK, TOKEN_DAY_OF_MONTH, TOKEN_MONTH, TOKEN_YEAR,&lt;br /&gt;
          TOKEN_HOUR_12, TOKEN_HOUR_24, TOKEN_MINUTE, TOKEN_SECOND,&lt;br /&gt;
          TOKEN_AM_PM });&lt;br /&gt;
  public String[] MONTH_LONG = { &amp;quot;January&amp;quot;, &amp;quot;February&amp;quot;, &amp;quot;March&amp;quot;, &amp;quot;April&amp;quot;,&lt;br /&gt;
          &amp;quot;May&amp;quot;, &amp;quot;June&amp;quot;, &amp;quot;July&amp;quot;, &amp;quot;August&amp;quot;, &amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;,&lt;br /&gt;
          &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot; };&lt;br /&gt;
  public String[] MONTH_SHORT = { &amp;quot;Jan&amp;quot;, &amp;quot;Feb&amp;quot;, &amp;quot;Mar&amp;quot;, &amp;quot;Apr&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;Jun&amp;quot;,&lt;br /&gt;
          &amp;quot;Jul&amp;quot;, &amp;quot;Aug&amp;quot;, &amp;quot;Sept&amp;quot;, &amp;quot;Oct&amp;quot;, &amp;quot;Nov&amp;quot;, &amp;quot;Dec&amp;quot; };&lt;br /&gt;
  public String[] WEEKDAY_LONG = { &amp;quot;Sunday&amp;quot;, &amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;,&lt;br /&gt;
          &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot; };&lt;br /&gt;
  public String[] WEEKDAY_SHORT = { &amp;quot;Sun&amp;quot;, &amp;quot;Mon&amp;quot;, &amp;quot;Tue&amp;quot;, &amp;quot;Wed&amp;quot;, &amp;quot;Thu&amp;quot;, &amp;quot;Fri&amp;quot;,&lt;br /&gt;
          &amp;quot;Sat&amp;quot; };&lt;br /&gt;
  public static String getAM() {&lt;br /&gt;
      return AM;&lt;br /&gt;
    }&lt;br /&gt;
  public static String getPM() {&lt;br /&gt;
      return PM;&lt;br /&gt;
    }&lt;br /&gt;
  public String[] getWEEKDAY_LONG() {&lt;br /&gt;
    return WEEKDAY_LONG;&lt;br /&gt;
  }&lt;br /&gt;
  public String[] getWEEKDAY_SHORT() {&lt;br /&gt;
    return WEEKDAY_SHORT;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implement SimpleDateFormat for GWT ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;dl&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;Title: &amp;lt;/b&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;SimpleDateFormat&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;Description: &amp;lt;/b&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;GWT does not implement any of the java.text package, so this class tries&lt;br /&gt;
 * to fill the void of the missing java.text.SimpleDateFormat class. This&lt;br /&gt;
 * version however only supports a subset of the date and time patterns&lt;br /&gt;
 * supported by its java.text counterpart. The pattern symbols supported by this&lt;br /&gt;
 * class are:&lt;br /&gt;
 * &amp;lt;dl&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;E&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Day in a week&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;d&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Day of the month&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;y&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Year&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;M&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Month January, Jan, 01, 1&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;H&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Hour in 24 hour format (0-23)&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;h&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Hour in 12 hour format (1-12)&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;m&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Minute of the hour &amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;s&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;Seconds of the minute&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;a&amp;lt;/b&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
 * &amp;lt;dd&amp;gt;am/pm&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;/dl&amp;gt;&lt;br /&gt;
 * All characters that are not recognised as a date format character are&lt;br /&gt;
 * translated literally into the output string. &amp;lt;br/&amp;gt; &amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &amp;lt;/dl&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * A simple date parsing facility has also been implemented resembling the java&lt;br /&gt;
 * prototype. You can currently parse most numeric patterns but no temporal&lt;br /&gt;
 * literals (such as day or month names).&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * @author &lt;br /&gt;
 * @version $Revision: 0.0 $&lt;br /&gt;
 */&lt;br /&gt;
public class SimpleDateFormat {&lt;br /&gt;
  private String format;&lt;br /&gt;
  private DateLocale locale = new DateLocale();&lt;br /&gt;
  /**&lt;br /&gt;
   * Gets the support locale for formatting and parsing dates&lt;br /&gt;
   * @return&lt;br /&gt;
   */&lt;br /&gt;
  public DateLocale getLocale() {&lt;br /&gt;
      return locale;&lt;br /&gt;
    }&lt;br /&gt;
  public void setLocale(DateLocale locale) {&lt;br /&gt;
      this.locale = locale;&lt;br /&gt;
    }&lt;br /&gt;
  public SimpleDateFormat(String pattern) {&lt;br /&gt;
    format = pattern;&lt;br /&gt;
  }&lt;br /&gt;
  public String format(Date date) {&lt;br /&gt;
    String f = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (format != null &amp;amp;&amp;amp; format.length() &amp;gt; 0) {&lt;br /&gt;
      String lastTokenType = null;&lt;br /&gt;
      String currentToken = &amp;quot;&amp;quot;;&lt;br /&gt;
      for (int i = 0; i &amp;lt; format.length(); i++) {&lt;br /&gt;
        String thisChar = format.substring(i, i + 1);&lt;br /&gt;
        String currentTokenType = DateLocale.SUPPORTED_DF_TOKENS&lt;br /&gt;
                .contains(thisChar) ? thisChar : &amp;quot;&amp;quot;;&lt;br /&gt;
        if (currentTokenType.equals(lastTokenType) || i == 0) {&lt;br /&gt;
          currentToken += thisChar;&lt;br /&gt;
          lastTokenType = currentTokenType;&lt;br /&gt;
        } else {&lt;br /&gt;
          if (&amp;quot;&amp;quot;.equals(lastTokenType))&lt;br /&gt;
            f += currentToken;&lt;br /&gt;
          else&lt;br /&gt;
            f += handleToken(currentToken, date);&lt;br /&gt;
          currentToken = thisChar;&lt;br /&gt;
          lastTokenType = currentTokenType;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (&amp;quot;&amp;quot;.equals(lastTokenType))&lt;br /&gt;
        f += currentToken;&lt;br /&gt;
      else&lt;br /&gt;
        f += handleToken(currentToken, date);&lt;br /&gt;
    }&lt;br /&gt;
    return f;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * takes a date format string and returns the formatted portion of the date.&lt;br /&gt;
   * For instance if the token is MMMM then the full month name is returned.&lt;br /&gt;
   * &lt;br /&gt;
   * @param token&lt;br /&gt;
   *            date format token&lt;br /&gt;
   * @param date&lt;br /&gt;
   *            date to format&lt;br /&gt;
   * @return formatted portion of the date&lt;br /&gt;
   */&lt;br /&gt;
  private String handleToken(String token, Date date) {&lt;br /&gt;
    String response = token;&lt;br /&gt;
    String tc = token.substring(0, 1);&lt;br /&gt;
    if (DateLocale.TOKEN_DAY_OF_WEEK.equals(tc)) {&lt;br /&gt;
      if (token.length() &amp;gt; 3)&lt;br /&gt;
        response = locale.getWEEKDAY_LONG()[date.getDay()];&lt;br /&gt;
      else&lt;br /&gt;
        response = locale.getWEEKDAY_SHORT()[date.getDay()];&lt;br /&gt;
    } else if (DateLocale.TOKEN_DAY_OF_MONTH.equals(tc)) {&lt;br /&gt;
      if (token.length() == 1)&lt;br /&gt;
        response = Integer.toString(date.getDate());&lt;br /&gt;
      else&lt;br /&gt;
        response = twoCharDateField(date.getDate());&lt;br /&gt;
    } else if (DateLocale.TOKEN_MONTH.equals(tc)) {&lt;br /&gt;
      switch (token.length()) {&lt;br /&gt;
      case 1:&lt;br /&gt;
        response = Integer.toString(date.getMonth() + 1);&lt;br /&gt;
        break;&lt;br /&gt;
      case 2:&lt;br /&gt;
        response = twoCharDateField(date.getMonth() + 1);&lt;br /&gt;
        break;&lt;br /&gt;
      case 3:&lt;br /&gt;
        response = locale.MONTH_SHORT[date.getMonth()];&lt;br /&gt;
        break;&lt;br /&gt;
      default:&lt;br /&gt;
        response = locale.MONTH_LONG[date.getMonth()];&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    } else if (DateLocale.TOKEN_YEAR.equals(tc)) {&lt;br /&gt;
      if (token.length() &amp;gt; 2)&lt;br /&gt;
        response = Integer.toString(date.getYear() + 1900);&lt;br /&gt;
      else&lt;br /&gt;
        response = twoCharDateField(date.getYear());&lt;br /&gt;
    } else if (DateLocale.TOKEN_HOUR_12.equals(tc)) {&lt;br /&gt;
      int h = date.getHours();&lt;br /&gt;
      if (h == 0)&lt;br /&gt;
        h = 12;&lt;br /&gt;
      else if (h &amp;gt; 12)&lt;br /&gt;
        h -= 12;&lt;br /&gt;
      if (token.length() &amp;gt; 1)&lt;br /&gt;
        response = twoCharDateField(h);&lt;br /&gt;
      else&lt;br /&gt;
        response = Integer.toString(h);&lt;br /&gt;
    } else if (DateLocale.TOKEN_HOUR_24.equals(tc)) {&lt;br /&gt;
      if (token.length() &amp;gt; 1)&lt;br /&gt;
        response = twoCharDateField(date.getHours());&lt;br /&gt;
      else&lt;br /&gt;
        response = Integer.toString(date.getHours());&lt;br /&gt;
    } else if (DateLocale.TOKEN_MINUTE.equals(tc)) {&lt;br /&gt;
      if (token.length() &amp;gt; 1)&lt;br /&gt;
        response = twoCharDateField(date.getMinutes());&lt;br /&gt;
      else&lt;br /&gt;
        response = Integer.toString(date.getMinutes());&lt;br /&gt;
    } else if (DateLocale.TOKEN_SECOND.equals(tc)) {&lt;br /&gt;
      if (token.length() &amp;gt; 1)&lt;br /&gt;
        response = twoCharDateField(date.getSeconds());&lt;br /&gt;
      else&lt;br /&gt;
        response = Integer.toString(date.getSeconds());&lt;br /&gt;
    } else if (DateLocale.TOKEN_AM_PM.equals(tc)) {&lt;br /&gt;
      int hour = date.getHours();&lt;br /&gt;
      if (hour &amp;gt; 11)&lt;br /&gt;
        response = DateLocale.getPM();&lt;br /&gt;
      else&lt;br /&gt;
        response = DateLocale.getAM();&lt;br /&gt;
    }&lt;br /&gt;
    return response;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * This is basically just a sneaky way to guarantee that our 1 or 2 digit&lt;br /&gt;
   * numbers come out as a 2 character string. we add an arbitrary number&lt;br /&gt;
   * larger than 100, convert this new number to a string, then take the right&lt;br /&gt;
   * most 2 characters.&lt;br /&gt;
   * &lt;br /&gt;
   * @param num&lt;br /&gt;
   * @return&lt;br /&gt;
   */&lt;br /&gt;
  private String twoCharDateField(int num) {&lt;br /&gt;
    String res = Integer.toString(num + 1900);&lt;br /&gt;
    res = res.substring(res.length() - 2);&lt;br /&gt;
    return res;&lt;br /&gt;
  }&lt;br /&gt;
  private static Date newDate(long time) {&lt;br /&gt;
    return new Date(time);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Parses text and returns the corresponding date object. &lt;br /&gt;
   * &lt;br /&gt;
   * @param source&lt;br /&gt;
   * @return java.util.Date&lt;br /&gt;
   */&lt;br /&gt;
  public Date parse(String source){&lt;br /&gt;
    return SimpleDateParser.parse(source, format);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>