HelpF.pro

Как преобразовать дату в формат RFC 822 и обратно?

Создавая обмены данными между 1С и сайтами, часто приходится форматировать вывод даты в стандарт RCF-822 или преобразовывать его в понятную для 1С ДатуВремя.

Дата в формате RFC-822 выглядит так: Tue, 12 Aug 2013 14:15:00 +0400 

Небольшая справка по стандартам:

Как дату перевести в формат RFC-822?

Код 1C v 8.2 УП
 

ДатаВФорматеRFC822 = Формат(ТекущаяДата(),"Л=en_US; ДФ='ddd, dd MMM yyyy hh:mm:ss +0400 '");

Как из формата RFC-822 получить дату и время для 1С?

Код 1C v 8.2 УП
 

// Функция преобразовывает дату в формате RFC822 к формату 1С - дата и время

// Параметры

// ДатаВФорматеRFC822 – Строка вида "Thu, 10 Aug 2006 14:48:27 +0400"

// Возвращаемое значение:

// <Дата> – Результат преобразования или Неопределено, если преобразование не удалось

Функция ПреобразоватьRFC822КДате0(ДатаВФорматеRFC822) Экспорт

КопияСтроки = ДатаВФорматеRFC822;

СтруктураДаты = Новый Структура("Год,Месяц,День,Час,Минута,Секунда", "","","","","","");

Месяцы = Новый Структура("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", "01","02","03","04","05","06","07","08","09","10","11","12");

Для каждого КлючИЗначение Из Месяцы Цикл

Позиция = Найти(КопияСтроки,КлючИЗначение.Ключ);

Если Позиция > 0 Тогда

СтруктураДаты.Месяц = КлючИЗначение.Значение;

Прервать;

КонецЕсли;

КонецЦикла;

Состояние = 0;

Для ш=0 По СтрДлина(КопияСтроки) Цикл

ТекущийСимвол = ПолучитьСимвол(КопияСтроки, ш);

ТекСимволЦифра= ЭтоЦифра(ТекущийСимвол);

Если ТекСимволЦифра И Состояние = 0 Тогда

СтруктураДаты.День = СтруктураДаты.День + ТекущийСимвол;

Состояние = 1; //начало день

ИначеЕсли ТекСимволЦифра И Состояние = 1 Тогда

СтруктураДаты.День = СтруктураДаты.День + ТекущийСимвол;

Состояние = 2; //ждем год

ИначеЕсли ТекСимволЦифра И Состояние = 2 Тогда

СтруктураДаты.Год = СтруктураДаты.Год + ТекущийСимвол;

Состояние = 3; //продолжаем год

ИначеЕсли ТекСимволЦифра И Состояние = 3 Тогда

СтруктураДаты.Год = СтруктураДаты.Год + ТекущийСимвол;

ИначеЕсли ТекущийСимвол = " " И Состояние = 3 Тогда

Состояние = 4; //дальше час

ИначеЕсли ТекСимволЦифра И Состояние = 4 Тогда

СтруктураДаты.Час = СтруктураДаты.Час + ТекущийСимвол;

ИначеЕсли ТекущийСимвол = ":" И Состояние = 4 Тогда

Состояние = 5; //дальше минута

ИначеЕсли ТекСимволЦифра И Состояние = 5 Тогда

СтруктураДаты.Минута = СтруктураДаты.Минута + ТекущийСимвол;

ИначеЕсли ТекущийСимвол = ":" И Состояние = 5 Тогда

Состояние = 6; //дальше секунда

ИначеЕсли ТекСимволЦифра И Состояние = 6 Тогда

СтруктураДаты.Секунда = СтруктураДаты.Секунда + ТекущийСимвол;

ИначеЕсли ТекущийСимвол = " " И Состояние = 6 Тогда

Прервать;

КонецЕсли;

КонецЦикла;

Попытка

Результат = Дата(СтруктураДаты.Год+СтруктураДаты.Месяц+СтруктураДаты.День

+СтруктураДаты.Час+СтруктураДаты.Минута+СтруктураДаты.Секунда);

Исключение

Результат = Неопределено;

КонецПопытки;

Возврат Результат;

КонецФункции // ПреобразоватьRFC822КДате()

В процессе изучения вопроса, встретил еще несколько вариантов:

Код 1C v 8.х
  // Автор: Mavka 
// По типу: Wed, 30 Mar 2011 17:50:11 +0200 
// Я написала код, но без учета часовых поясов( 
Функция ВДатуRFC822(Дата1С, ПоправкаGMT) Экспорт
    Перем ТемпДата;
    Перем ТемпГод;
    Перем ТемпМесяц;
    Перем ТемпДень;
    Перем ДатаRFC822;
    Перем ТемпЧас;
    Перем ТемпМинута;
    Перем ТемпСекунда;
    Перем НомерДняНедели;
    Перем ТемпДеньНедели;
    Перем МесяцИмя;
    ТемпДата = Дата1С - 60 * 60 * ПоправкаGMT;
    ТемпГод = СтрЗаменить(Формат(Год(ТемпДата),"ND=4; NLZ="),Символы.НПП,"");
    ТемпМесяц = Месяц(ТемпДата);
    Если ТемпМесяц = 1 Тогда
         МесяцИмя = "Jan";
     ИначеЕсли ТемпМесяц = 2 Тогда
         МесяцИмя = "Feb";
     ИначеЕсли ТемпМесяц = 3 ТОгда
         МесяцИмя = "Mar";
     ИначеЕсли ТемпМесяц = 4 Тогда
         МесяцИмя = "Apr";
     ИначеЕсли ТемпМесяц = 5 Тогда 
         МесяцИмя = "May";
     ИначеЕсли ТемпМесяц = 6 Тогда
         МесяцИмя = "Jun";
     ИначеЕсли ТемпМесяц = 7 Тогда
         МесяцИмя = "Jul";
     ИначеЕсли ТемпМесяц = 8 ТОгда
         МесяцИмя = "Aug";
     ИначеЕсли ТемпМесяц = 9 Тогда
         МесяцИмя = "Sep";
     ИначеЕсли ТемпМесяц = 10 Тогда 
         МесяцИмя = "Oct";
     ИначеЕсли ТемпМесяц = 11 Тогда
         МесяцИмя = "Nov";
     Иначе        
         МесяцИмя = "Dec";
    КонецЕсли;
    ТемпДень = Формат(День(ТемпДата),"ND=2; NLZ=");
    НомерДняНедели = ДеньНедели(ТемпДата);
    Если НомерДняНедели = 1 Тогда
         ТемпДеньНедели = "Mon";
     ИначеЕсли НомерДняНедели = 2 Тогда
         ТемпДеньНедели = "Tue";
     ИначеЕсли НомерДняНедели = 3 ТОгда
         ТемпДеньНедели = "Wed";
     ИначеЕсли НомерДняНедели = 4 Тогда
         ТемпДеньНедели = "Thu";
     ИначеЕсли НомерДняНедели = 5 Тогда 
         ТемпДеньНедели = "Fri";
     ИначеЕсли НомерДняНедели = 6 Тогда
         ТемпДеньНедели = "Sat";
     Иначе        
         ТемпДеньНедели = "Sun";
    КонецЕсли;
    
        ТемпЧас = ?(Час(ТемпДата) = 0, "00", Формат(Час(ТемпДата),"ND=2; NLZ="));
        ТемпМинута = ?(Минута(ТемпДата) = 0, "00", Формат(Минута(ТемпДата),"ND=2; NLZ="));
        ТемпСекунда = ?(Секунда(ТемпДата) = 0, "00", Формат(Секунда(ТемпДата),"ND=2; NLZ="));
        ДатаRFC822 = ТемпДеньНедели+ ", " + ТемпДень + " " + МесяцИмя + " " + ТемпГод + " " + ТемпЧас + ":" + ТемпМинута + ":" + ТемпСекунда + " +0200";
    
    Возврат ДатаRFC822;
КонецФункции

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/1675.html