Содержание
Различия в форматах записи даты
Этот вопрос на первый взгляд достаточно простой. Но стоит только посмотреть на все возможные строковые представления дат (форматы дат), то задача получить дату из строки уже не кажется такой легкой. Ниже несколько примеров, как записывается дата в разных странах:
- Россия: DD.MM.YYYY Пример: 24.12.2021
- США: MM-DD-YYYY Пример: 12.24.2021
- Венгрия: YYYY-MM-DD Пример 2021-12-24
Чтобы еще больше запутать ситуацию Чтобы внести единообразие в написание даты, был разработан стандарт ISO 8601, который предусматривает запись даты от более значимых чисел к менее значимым — год, месяц, день… и так далее. Пример: 20221224123456. Для удобства можно пользоваться разделителями. Пример
2022-12-24T12:34:56. Это важный момент, и ниже мы к нему вернемся.
Способы преобразования даты из строки
Метод Дата(), вариант по строке
Простейший способ, который подходит, если строка с датой каноническому формату YYYYMMDDhhmmss — это использовать метод Дата(). Пример:
Дата("20211231123456")
Получим значение с типом дата: 31.12.2021 12:34:56
Также, этот метод подходит, если строка с датой записана в локальном формате (т.е. совпадает с форматом даты операционной системы).
Например, в случае если в ОС выбран русский язык, то можно получить из строки дату вот так:
Дата("24.12.2022 12:34:56")
Результат будет 24.12.2022 12:34:56
А если у вас в настройках выбран формат Английский (США), то строковое представление даты должно быть другим:
Дата("12/24/2022 01:34:56 PM")
Важно! В случае использования строки с датой в локальном формате, она должна точно соответствовать этому формату! Иначе метод выдаст ошибку «Преобразование значения к типу Дата не может быть выполнено».
Метод Дата(), вариант по составляющим
Если нам известны составные части даты — год, месяц, день и т.д., можно использовать конструктор даты по составляющим. Задавать параметры можно как в виде строки, так и числом. Таким образом можно собрать дату из частей. Сами части можно получить различными способами — например, использовать преобразование строки в массив подстрок с помощью метода СтрРазделить().
Дата("2021", "12", "24", "12", "34", "56")Как получить дату из строки с разделителями?
Вот мы и вернулись к вопросу — что делать, когда строка даты содержит разделители — двоеточия, слеши, дефисы или другие. Можно поочередно очищать дату от лишних символов с помощью метода СтрЗаменить, например
ДатаСтрокой = "2021/12-31 12:34:56" ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "-", ""); ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "/", ""); ДатаСтрокой = СтрЗаменить(ДатаСтрокой, ":", "");
Но есть более интересный способ — использование двойного преобразования строки — сперва в массив, а затем обратно:
СтрСоединить(СтрРазделить(ДатаСтрокой, "-/ :"), "");
Что делает этот код:
Мы сперва преобразуем строку в массив подстрок, разделяя по символам-разделителям пр помощи метода СтрРазделить. В нашем примере это пробел, слеш, двоеточие и дефис. Если нам нужно будет добавить какие-то другие символы — можно будет просто дополнить строку символов-разделителей.
А дальше мы обратно собираем из массива строку при помощи метода СтрСоединить;
Преобразование строки в дату в БСП
В БСП 3.1 есть сразу две функции для того, чтобы преобразовать строку в дату, и реализованы они по-разному. Это функции ОбщегоНазначенияКлиентСервер.СтрокаВДату и СтроковыеФункцииКлиентСервер.СтрокаВДату
Первая функция принимает только один параметр — собственно строку, из которой мы хотим получить дату.
ОбщегоНазначенияКлиентСервер.СтрокаВДату("31/01/2025")
Вторая функция позволяет получить нужную часть даты — только дату, только время, или дату вместе со временем
СтроковыеФункцииКлиентСервер.СтрокаВДату("31/01/2025 23:59:59", ЧастиДаты.Время);//Получим только время 01.01.0001 23:59:59
Но и в одном, и во втором методах никакой магии нет, используется схожий принцип: строка делится на части, из нее вычленяются составляющие даты, производятся различные манипуляции, и происходит попытка привести значение к нужному типу. Для этого создается переменная с значением ОписаниеТипов, и затем у описания типов вызывается метод ПривестиЗначение. Если получилось — полученная дата возвращается, если не вышло — происходит следующая манипуляция и следующая попытка привести значение, и так несколько раз.
ОписаниеДаты = Новый ОписаниеТипов("Дата"); Дата = ОписаниеДаты.ПривестиЗначение(Значение);
Надеюсь, статья поможет вам разобраться, как преобразовать строку в дату. Если же хотите получить более цельное представление о разработке в 1С с нуля — рассмотрите мой видеокурс для начинающих.
Сэкономь часы на дебаге 1C!
Скачай PDF с топ-11 ошибок начинающих разработчиков + файл с примерами кода!