понедельник, 21 февраля 2011 г.

Форматирование даты/времени (ActionScript)

Преамбула:
От так вот неожиданно случилось, что в приложении стало необходимо выводить дату в формате диктуемым языком интерфейса (почти как в случае с настройками локали). Проблема скажем тривиальная. Есть наверняка куча всяких форматтеров, из которых на скоряк попался флексовый (была идея портировать явовский, но там тоже как то все мутно). Но т.к. приложение на чистом ас3, то очень не хотелось таки цеплять флексовые либы и прочее, тем более флексовый форматтер юзает еще какие то классы из либ. Был бы он "сам в себе" взял бы не раздумывая, но увы и ах...

Проблема:
Применять разное форматирование даты/времени в зависимости от языковых настроек интерфейса.

Решение:
По сути требовалось форматирование даты в нашем и буржуйском формате (например: 21.02.2011 или 02/21/2011) и время в 24-часовом формате для всех языков оставить (пока).
Долго не мудрствуя родился ниже приведенный класс с несложной, но готовой к расширению, функциональностью.

public class DateFormatter
{
  private static const MAP_TOKENS:Object = new Object();
  
  private static const DATE:Date = new Date();

  /// метод форматирования №1
  public static function formatDate(date:Date, pattern:String):String
  {
    DATE.setTime(date.getTime());
    return format(DATE, pattern);
  }
  
  /// метод форматирования №2
  public static function formatTimestamp(timestamp:Number, pattern:String):String
  {
    DATE.setTime(timestamp);
    return format(DATE, pattern);
  }
  
  private static function format(date:Date, pattern:String):String
  {
    DATE.setTime(date.getTime());
    
    var tokens:Array = [];
    
    for (var token:String in MAP_TOKENS) 
    {
      if (pattern.indexOf(token) != -1)
         tokens.push(token);
    }
    
    
    var retval:String = pattern;
    for each (token in tokens) 
    {
      retval = retval.replace(token, (MAP_TOKENS[token] as Function).apply());
    }
    
    return retval;
  }
  
  private static function formatSeconds():String
  {
    return leadZero(DATE.getSeconds());
  }
  
  private static function formatMinutes():String
  {
    return leadZero(DATE.getMinutes());
  }
  
  private static function formatHours():String
  {
    return leadZero(DATE.getHours());
  }
  
  private static function formatFullYear():String
  {
    return leadZero(DATE.getFullYear());
  }
  
  private static function formatDay():String
  {
    return leadZero(DATE.getDate());
  }
  
  private static function formatMonth():String
  {
    var month:int = DATE.getMonth() + 1;
    return leadZero(month);
  }
  
  private static function leadZero(value:int):String
  {
    return (value < 10 ? "0" : "") + value.toString();
  }
  
  
  // блок статической инициализации
  {
    MAP_TOKENS["MM"] = formatMonth;
    MAP_TOKENS["DD"] = formatDay;
    MAP_TOKENS["YYYY"] = formatFullYear;
    MAP_TOKENS["hh"] = formatHours;
    MAP_TOKENS["mm"] = formatMinutes;
    MAP_TOKENS["ss"] = formatMinutes; 
  }
}
Пример использования:
var sysdate:Date = new Date();
trace(DateFormatter.formatDate(sysdate, "DD.MM.YYYY"); // 21.02.2011
trace(DateFormatter.formatDate(sysdate, "MM/DD/YYYY"); // 02/21/2011
trace(DateFormatter.formatDate(sysdate, "MM/DD/YYYY hh:mm:ss"); // 02/21/2011 14:26:01
trace(DateFormatter.formatDate("hh:mm:ss"); // 14:26:01
// или так можно, но только осторожно
trace(DateFormatter.formatDate("Today is DD.MM.YYYY"); // Today is 21.02.2011
Необходимые для конкретного языка шаблоны форматирования хранятся в соответствующих файлах. Вытягивать и хранить это все можно способом описанным в этом посте. Например:

   
 

   
    

   
 

Комментариев нет:

Отправить комментарий