Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Форматирование даты. Прикололо... (число прочтений - 5610 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Форматирование даты. Прикололо...
07. Июня 2006 :: 12:22
Печать  
Код
Выбрать все
Перем лФорматДатыСониЭриксон;


Функция лДатаФормат( нДата, нФормат)  
	ЗначВозврата = ""+нФормат;
	Если ПустоеЗначение(нДата) = 1 Тогда
		Возврат ЗначВозврата;
	КонецЕсли;
	тМесяцСтр = Формат(нДата,"Д ММММГГГГ");
	поз = Найти(тМесяцСтр," ");
	тМесяцСтр = СокрЛ(Лев(тМесяцСтр,поз));

	СписЗамен = СоздатьОбъект("СписокЗначений");
	СписЗамен.ДобавитьЗначение("ГГГГ"	,""+ДатаГод(нДата));
	СписЗамен.ДобавитьЗначение("ГГ"		,Прав(""+ДатаГод(нДата),2));
	СписЗамен.ДобавитьЗначение("ММММ"	,тМесяцСтр);
	СписЗамен.ДобавитьЗначение("ММ"		,Формат(ДатаМесяц(нДата),"Ч(0)2"));
	СписЗамен.ДобавитьЗначение("мМ"		,""+ДатаМесяц(нДата));
	СписЗамен.ДобавитьЗначение("ДД"		,Формат(ДатаЧисло(нДата),"Ч(0)2"));
	СписЗамен.ДобавитьЗначение("ДД"		,""+ДатаЧисло(нДата));
	СписЗамен.ДобавитьЗначение("НН"		,Формат(НомерНеделиГода(нДата),"Ч(0)2"));
	СписЗамен.ДобавитьЗначение("нН"		,""+НомерНеделиГода(нДата));
	СЦ = 0;
	Для СЦ = 1 По СписЗамен.РазмерСписка() Цикл
		тПатернЗамн = "";
		тПатернЗнач = СписЗамен.ПолучитьЗначение(СЦ,тПатернЗамн);
		ЗначВозврата = СтрЗаменить(ЗначВозврата,тПатернЗнач,тПатернЗамн);
	КонецЦикла;
	Возврат ЗначВозврата;
КонецФункции // лДатаФормат()
//Using
Печ_POP_date		= лДатаФормат( нПартия.ДатаПокупки, лФорматДатыСониЭриксон);
Печ_Manufacture_Year_In = лДатаФормат(нПартия.ДатаПроизводства,"ГГ");
Печ_Manufacture_week_In = лДатаФормат(нПартия.ДатаПроизводства,"НН");
//....
лФорматДатыСониЭриксон = "ГГГГ-ММ-ДД";
 


  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Форматирование даты. Прикололо...
Ответ #1 - 11. Июня 2006 :: 10:42
Печать  
Лихо...  Улыбка
  
Наверх
 
IP записан
 
cushe
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 8
Зарегистрирован: 15. Июня 2006
Re: Форматирование даты. Прикололо...
Ответ #2 - 15. Июня 2006 :: 09:08
Печать  
Есть пара замечаний :
1. Не хорошо сперва расчитывать все про запас, а потом использовать только пару позиций.
2. Не предусмотрен вариант идиотских масок типа ГГГГ-ММ-ГГГГ-ММ  Язык
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Форматирование даты. Прикололо...
Ответ #3 - 15. Июня 2006 :: 09:51
Печать  
cushe писал(а) 15. Июня 2006 :: 09:08:
Есть пара замечаний :
1. Не хорошо сперва расчитывать все про запас, а потом использовать только пару позиций.
2. Не предусмотрен вариант идиотских масок типа ГГГГ-ММ-ГГГГ-ММ  Язык

Знаю что есть возможность оптимизации.
Свой вариант пожалуйста? Язык
Компилированные патерны?
Как вариант могу предложить маску на подобией шаблона:
[ГГ] и т.п.
  
Наверх
IP записан
 
alexqc
Junior Member
**
Отсутствует



Сообщений: 77
Местоположение: АР Крым, Симферополь
Зарегистрирован: 21. Июня 2006
Пол: Мужской
Re: Форматирование даты. Прикололо...
Ответ #4 - 04. Августа 2006 :: 16:34
Печать  
cushe писал(а) 15. Июня 2006 :: 09:08:
Есть пара замечаний :
1. Не хорошо сперва расчитывать все про запас, а потом использовать только пару позиций.

Ну тут как - или писать просто, или писать сложно, но не факт что работать намного быстрее...

Цитата:
2. Не предусмотрен вариант идиотских масок типа ГГГГ-ММ-ГГГГ-ММ  Язык

Как не предусмотрен? Предусмотрен. Все намано. Проверь.

А вот на счет оптимизации - чем заполнение СЗ и выборка замен из него просто замены подстрок????

Т.е. вместо

     СписЗамен.ДобавитьЗначение("ГГГГ"      ,""+ДатаГод(нДата));
     СписЗамен.ДобавитьЗначение("ГГ"            ,Прав(""+ДатаГод(нДата),2));

Делать сразу

     ЗначВозврата = СтрЗаменить(ЗначВозврата, "ГГГГ", ДатаГод(нДата) );
     ЗначВозврата = СтрЗаменить(ЗначВозврата,    "ГГ", Прав(""+ДатаГод(нДата),2)  );
???

Я бы понял, если б список неоднократно использовался, но тут же один раз?







  

Везде - от моря Черного до снежной Колымы - мы трудностям показываем кукиш.
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Форматирование даты. Прикололо...
Ответ #5 - 30. Августа 2006 :: 19:02
Печать  
Когда-то делал класс Дата. В нем ИзСтроки и Встроку
Код
Выбрать все
Перем Дата_;


Процедура Конструктор()
	Дата_ = ТекущаяДата();
КонецПроцедуры	// Конструктор


Процедура Установить(НоваяДата) Экспорт
	Если ТипЗначения(НоваяДата) = 2 Тогда	//строка
		Дата_ = Дата(НоваяДата);
	ИначеЕсли ТипЗначения(НоваяДата) = 3 Тогда	//дата
		Дата_ = НоваяДата;
	КонецЕсли;
КонецПроцедуры	// Установить


Функция Получить() Экспорт
	Возврат Дата_;
КонецФункции	// Получить


Функция ИзСтроки(СтрокаДаты_, ФорматДаты_) Экспорт
	Если ПустаяСтрока(ФорматДаты_) = 1 Тогда	//конвертируем строку типа '01.01.2005'
		Возврат Дата(СтрокаДаты_);
	КонецЕсли;
	//допустимые части: ДД ММ ММММ ГГ ГГГГ
	Дата_ = ПолучитьПустоеЗначение("Дата");

	//уберем разделители из строки формата и даты
	ФорматДаты = "";
	Для инд = 1 По СтрДлина(ФорматДаты_) Цикл
		символ = Сред(ФорматДаты_, инд, 1);
		Если Найти("ДМГ", символ) <> 0 Тогда
			ФорматДаты = ФорматДаты + символ;
		КонецЕсли;
	КонецЦикла;

	СтрокаДаты= "";
	Для инд = 1 По СтрДлина(СтрокаДаты_) Цикл
		символ = Сред(СтрокаДаты_, инд, 1);
		Если Найти(" .-/", символ) = 0 Тогда
			СтрокаДаты = СтрокаДаты + символ;
		КонецЕсли;
	КонецЦикла;

	Если ФорматДаты = "ДДММГГГГ" Тогда
		Дата_ = Дата(Сред(СтрокаДаты,5), Сред(СтрокаДаты, 3, 2), Лев(СтрокаДаты, 2));
	ИначеЕсли ФорматДаты = "ГГГГММДД" Тогда
		Дата_ = Дата(Лев(СтрокаДаты, 4), Сред(СтрокаДаты,5, 2), Сред(СтрокаДаты, 7));
	КонецЕсли;

	Возврат Дата_;
КонецФункции	// ИзСтроки


Функция ВСтроку(ФорматДаты) Экспорт
	стр = ФорматДаты;
	//формат строки: ЧастьРазделительЧасть
	//допустимые части: ДД ММ ММММ ГГ ГГГГ НННН

	ПадежМесяца = "И";
	Если Найти(ФорматДаты, "ДД") <> 0 Тогда
		д = Формат(ДатаЧисло(Дата_), "Ч(0)2.0");
		стр = СтрЗаменить(стр, "ДД", д);
		//Сообщить("Число=" + д);
		ПадежМесяца = "Р";
	КонецЕсли;

	Если Найти(ФорматДаты, "НННН") <> 0 Тогда
		дн = Формат(Дата_, "ДНННН");
		стр = СтрЗаменить(стр, "НННН", дн);
		//Сообщить("День недели=" + дн);
		ПадежМесяца = "Р";
	КонецЕсли;

	Если Найти(ФорматДаты, "ГГГГ") <> 0 Тогда
		г = Строка(ДатаГод(Дата_));
		стр = СтрЗаменить(стр, "ГГГГ", г);
		//Сообщить("Год=" + г);
	ИначеЕсли Найти(ФорматДаты, "ГГ") <> 0 Тогда
		г = Прав(Строка(ДатаГод(Дата_)), 2);
		стр = СтрЗаменить(стр, "ГГ", г);
		//Сообщить("Год=" + г);
	КонецЕсли;

	Если Найти(ФорматДаты, "ММММ") <> 0 Тогда
		Если ПадежМесяца = "Р" Тогда
			м = Формат(Дата_, "ДДДММММГГГГ");	//когда полная строка формата, возвращает месяц в родит падеже
			м = СтрПолучитьСтроку(СтрЗаменить(м, " ", РазделительСтрок), 2);
		Иначе
			м = Формат(Дата_, "ДММММ");
		КонецЕсли;
		стр = СтрЗаменить(стр, "ММММ", м);
		//Сообщить("Месяц=" + м);
	ИначеЕсли Найти(ФорматДаты, "ММ") <> 0 Тогда
		м = Формат(ДатаМесяц(Дата_), "Ч(0)2.0");
		стр = СтрЗаменить(стр, "ММ", м);
		//Сообщить("Месяц=" + м);
	КонецЕсли;

	Возврат стр;
КонецФункции	// ВСтроку
 



ЗЫ никак не хочет файл прикреплять: пишет неверный формат файлаПечаль .rar
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать