1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-02-13 19:42:02 +02:00
Фикс загрузки из макетов при использовании английской локали платформы
This commit is contained in:
alkoleft 2023-10-03 23:02:54 +03:00
parent 20f4c24244
commit 01d455ce2d
3 changed files with 113 additions and 34 deletions

View File

@ -45,7 +45,6 @@ jobs:
tests_linux_en:
name: Tests Linux 8.3.21.1895 en_US
uses: ./.github/workflows/run-tests-linux.yml
if: false
needs: build_artifacts
with:
v8_version: 8.3.21.1895

View File

@ -73,44 +73,82 @@
Функция ПривестиЗначениеКДате(ОписаниеТипа, Знач Значение) Экспорт
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
ДатаМассив = СтрРазделить(Значение, ".,:T-/ ");
НетВремени = 3;
ЕстьВремя = 7;
Полдень = 12;
ДлинаДеньМесяц = 2;
ДлинаГод = 4;
ДатаИзСтроки_ПроверкаДлиныДаты(ДатаМассив.Количество(), НетВремени, ЕстьВремя);
/////////////////////////////////////////////////////////////////////////////////
ДатаИзСтроки_ОбработкаМассиваДаты(ДатаМассив); // если вдруг кто-то забыл вставить что-то между разделителями.
ДатаИзСтроки_ПроверкаМесяца(ДатаМассив[1]); // проверка месяца, корректно или нет
Если ДатаМассив.Количество() = ЕстьВремя Тогда // время формата HH:mm:ss tt или H:mm:ss tt
ВГр = ДатаМассив.ВГраница();
ПозЧас = 3;
ДатаМассив[ВГр] = ВРег(ДатаМассив[ВГр]);
ЧасДоп = ?(ДатаМассив[ВГр] = "PM", Полдень, 0);
ДатаМассив.Удалить(ВГр);
// если все-таки решили вписать не существующий формат попробуем его воспринять адекватно.
ДатаМассив[ПозЧас] = Строка(?(Число(ДатаМассив[ПозЧас]) + ЧасДоп >= 24, ДатаМассив[ПозЧас], Число(ДатаМассив[ПозЧас]) + ЧасДоп));
КонецЕсли;
МассивРазделителей = Новый Массив;
МассивРазделителей.Добавить(".");
МассивРазделителей.Добавить("/");
МассивРазделителей.Добавить("-");
Для Индекс = 0 По ДатаМассив.ВГраница() Цикл // добавляем ведущие нули в маски d.M.yy, yy.M.d, H:mm:ss
СтрокаДаты = Неопределено;
КоличествоБлоковДаты = 3;
ДлинаГода = 4;
Для Каждого Разделитель Из МассивРазделителей Цикл
Если ЗначениеЗаполнено(СтрокаДаты) Тогда
Прервать;
КонецЕсли;
МассивЧастейДат = СтрРазделить(Значение, Разделитель);
Если МассивЧастейДат.Количество() = КоличествоБлоковДаты Тогда
Если СтрДлина(МассивЧастейДат[2]) = ДлинаГода Тогда
СтрокаДаты = МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
ИначеЕсли СтрДлина(МассивЧастейДат[0]) = ДлинаГода Тогда
СтрокаДаты = МассивЧастейДат[0] + МассивЧастейДат[1] + МассивЧастейДат[2];
Иначе
СтрокаДаты = "20" + МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
КонецЕсли;
КонецЕсли;
ДатаМассив[Индекс] = Формат(Число(ДатаМассив[Индекс]), "ЧЦ=" + ?(СтрДлина(ДатаМассив[Индекс]) > ДлинаДеньМесяц, "4", "2") + "; ЧВН=; ЧГ=0; ЧН=00");
КонецЦикла;
Результат = ОписаниеТипа.ПривестиЗначение(СтрокаДаты);
ПозГод = 2;
ПозМесяц = 1;
ПозДень = 0;
// Проверка гггг.мм.дд или дд.мм.гггг
Если СтрДлина(ДатаМассив[ПозГод]) = ДлинаГод Тогда
ВремДата = ДатаМассив[ПозДень];
ДатаМассив[ПозДень] = ДатаМассив[ПозГод];
ДатаМассив[ПозГод] = ВремДата;
КонецЕсли;
// обработка масок dd.MM.yy и yy.MM.dd, первая маска в приоритете.
Если СтрДлина(ДатаМассив[0]) = ДлинаДеньМесяц И СтрДлина(ДатаМассив[ПозГод]) = ДлинаДеньМесяц Тогда
УсловнаяГраница = 66; // что больше, то 20 век, что меньше - 21
Год = ?(Число(ДатаМассив[ПозГод]) > УсловнаяГраница, "19", "20");
Попытка // попытаемся превратить ее в дату
// Собственно - проверка, попытка получить дату
//@skip-check module-unused-local-variable - Необходима для помещения результата получения даты из строки.
ТестоваяДата = Дата(Год + ДатаМассив[ПозГод] + ДатаМассив[ПозМесяц] + ДатаМассив[ПозДень]);
ВремДата = ДатаМассив[ПозДень];
ДатаМассив[ПозДень] = (Год + ДатаМассив[ПозГод]);
ДатаМассив[ПозГод] = ВремДата;
Исключение // если не получилось, значит маска yy.MM.dd
ТестоваяДата = Неопределено;
ДатаМассив[ПозДень] = (Год + ДатаМассив[ПозДень]);
КонецПопытки;
КонецЕсли;
Результат = ОписаниеТипа.ПривестиЗначение(СтрСоединить(ДатаМассив));
Возврат Результат;
@ -118,6 +156,7 @@
Функция ПривестиЗначениеКЧислу(ОписаниеТипа, Знач Значение) Экспорт
Значение = СтрЗаменить(Значение, ",", ".");
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
@ -150,4 +189,45 @@
КонецФункции
Процедура ДатаИзСтроки_ПроверкаДлиныДаты(ДлинаСтроки, ДлинаБезВремени = 0, ДлинаСВременем = 0, ДатаСтрока = "")
Если ДлинаБезВремени = 0 ИЛИ ДлинаСВременем = 0 Тогда
ДлинаБезВремени = 6;
ДлинаСВременем = 22;
КонецЕсли;
// Временные зоны не поддерживаются, однако формат даты в нулевой зоне попадает в допустимую длину других поддерживаемых форматов.
ДлинаДатыВНулевойЗоне = 20;
ЭтоНулеваяЗона = ДлинаСтроки = ДлинаДатыВНулевойЗоне И СтрЗаканчиваетсяНа(ДатаСтрока, "Z");
Если ДлинаСтроки < ДлинаБезВремени Или ДлинаСтроки > ДлинаСВременем Или ЭтоНулеваяЗона Тогда
ВызватьИсключение "Дата в строке не подходит ни под одну маску.";
КонецЕсли;
КонецПроцедуры
Процедура ДатаИзСтроки_ОбработкаМассиваДаты(ДатаМассив)
Для Индекс = 0 По ДатаМассив.ВГраница() Цикл
ДатаМассив[Индекс] = ?(СтрДлина(ДатаМассив[Индекс]) = 0, "0", ДатаМассив[Индекс]);
КонецЦикла;
КонецПроцедуры
Процедура ДатаИзСтроки_ПроверкаМесяца(МесяцСтрокой)
Если Число(МесяцСтрокой) > 12 Или Число(МесяцСтрокой) = 0 Тогда
ВызватьИсключение "Месяц выходит за границы диапазона.";
КонецЕсли;
КонецПроцедуры
#КонецОбласти