Google Apps Script: Как преобразовать строку в дату?

Преобразование строки в дату — распространенная задача в Google Apps Script. Часто данные о датах и времени хранятся в виде строк, особенно при импорте из внешних источников, таких как Google Sheets, CSV-файлы или API. Для выполнения операций с датами, таких как сравнение, сортировка или форматирование, необходимо преобразовать эти строки в объекты Date.

Зачем преобразовывать строки в даты?

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

Выполнения математических операций с датами (например, вычисление разницы между датами).

Форматирования дат в нужном виде для отображения пользователю.

Сравнения дат для сортировки или фильтрации данных.

Использования дат в API и других интеграциях.

Обзор основных методов преобразования

Существует несколько способов преобразовать строку в дату в Google Apps Script:

Utilities.parseDate(): Удобный метод для разбора строк даты с учетом формата и часового пояса.

Объект Date: Конструктор Date может быть использован для создания объектов даты из строк, но требует более точного соответствия формату.

Использование `Utilities.parseDate()` для преобразования строки в дату

Синтаксис и параметры `Utilities.parseDate()`

Метод Utilities.parseDate() имеет следующий синтаксис:

Utilities.parseDate(dateString, timeZone, format)

dateString (String): Строка, которую необходимо преобразовать в дату.

timeZone (String): Часовой пояс, в котором находится дата (например, "GMT", "America/Los_Angeles", "Europe/Moscow"). Список доступных часовых поясов можно найти в документации Java.

format (String): Формат строки даты, использующий символы из SimpleDateFormat (например, "yyyy-MM-dd", "MM/dd/yyyy HH:mm:ss"). Полный список символов можно найти в документации Java.

Примеры использования с различными форматами дат

/**
 * Преобразует строку в дату, используя Utilities.parseDate().
 * @param {string} dateString Строка, которую нужно преобразовать.
 * @param {string} timeZone Часовой пояс.
 * @param {string} format Формат строки.
 * @return {Date|null} Объект Date или null в случае ошибки.
 */
function stringToDateUtilities(dateString, timeZone, format) {
  try {
    return Utilities.parseDate(dateString, timeZone, format);
  } catch (e) {
    Logger.log('Ошибка преобразования: ' + e);
    return null; 
  }
}

//Пример 1:  Формат yyyy-MM-dd
var dateString1 = "2023-10-26";
var timeZone1 = "GMT";
var format1 = "yyyy-MM-dd";
var date1 = stringToDateUtilities(dateString1, timeZone1, format1);
Logger.log(date1); // Thu Oct 26 00:00:00 GMT+00:00 2023

//Пример 2:  Формат MM/dd/yyyy HH:mm:ss
var dateString2 = "10/26/2023 10:30:00";
var timeZone2 = "America/Los_Angeles";
var format2 = "MM/dd/yyyy HH:mm:ss";
var date2 = stringToDateUtilities(dateString2, timeZone2, format2);
Logger.log(date2); // Thu Oct 26 10:30:00 PDT 2023

Обработка ошибок и некорректных форматов

Utilities.parseDate() выбрасывает исключение, если строка не соответствует указанному формату или часовой пояс недействителен. Рекомендуется использовать try...catch для обработки этих исключений.

function stringToDateUtilitiesSafe(dateString, timeZone, format) {
  try {
    var date = Utilities.parseDate(dateString, timeZone, format);
    return date;
  } catch (e) {
    Logger.log('Ошибка преобразования: ' + e);
    return null; // Или другое значение по умолчанию
  }
}

var invalidDateString = "2023/10/26";
var invalidDate = stringToDateUtilitiesSafe(invalidDateString, "GMT", "yyyy-MM-dd");
Logger.log(invalidDate); // null

Преобразование строки в дату с помощью объекта `Date`

Создание объекта `Date` из строки

Объект Date может быть создан непосредственно из строки. Однако, строка должна соответствовать одному из поддерживаемых форматов даты и времени.

/**
 * Преобразует строку в дату, используя конструктор Date.
 * @param {string} dateString Строка, которую нужно преобразовать.
 * @return {Date|null} Объект Date или null в случае ошибки.
 */
function stringToDateDateObject(dateString) {
  var date = new Date(dateString);
  if (isNaN(date.getTime())) {
    Logger.log('Некорректный формат даты для конструктора Date');
    return null;
  }
  return date;
}

var dateString3 = "October 26, 2023";
var date3 = stringToDateDateObject(dateString3);
Logger.log(date3); // Thu Oct 26 00:00:00 GMT+0000 2023

var dateString4 = "2023-10-26T10:30:00Z"; // ISO 8601
var date4 = stringToDateDateObject(dateString4);
Logger.log(date4); // Thu Oct 26 10:30:00 GMT+0000 2023

Преимущества и недостатки использования объекта `Date`

Преимущества:

Простота использования для стандартных форматов.

Реклама

Недостатки:

Ограниченная поддержка форматов. Строка должна быть в формате, который распознается конструктором Date.

Неявное поведение с часовыми поясами. Зависит от настроек сервера/браузера.

Примеры с различными форматами строк

Объект Date хорошо работает с форматами ISO 8601, но может иметь проблемы с другими форматами. Рекомендуется использовать Utilities.parseDate() для более гибкой обработки.

var dateString5 = "Invalid Date String";
var date5 = stringToDateDateObject(dateString5);
Logger.log(date5); // Invalid Date

Работа с часовыми поясами при преобразовании

Указание часового пояса при использовании `Utilities.parseDate()`

Указание правильного часового пояса критически важно, чтобы дата была преобразована корректно. Если часовой пояс не указан, будет использован часовой пояс скрипта, который может отличаться от ожидаемого.

var dateString6 = "2023-10-26 10:30:00";
var timeZone6 = "America/Los_Angeles";
var format6 = "yyyy-MM-dd HH:mm:ss";
var date6 = stringToDateUtilities(dateString6, timeZone6, format6);
Logger.log(date6); // Thu Oct 26 10:30:00 PDT 2023

var dateString7 = "2023-10-26 10:30:00";
var timeZone7 = "Europe/Moscow";
var format7 = "yyyy-MM-dd HH:mm:ss";
var date7 = stringToDateUtilities(dateString7, timeZone7, format7);
Logger.log(date7); // Thu Oct 26 10:30:00 MSK 2023

Преобразование даты в другой часовой пояс

После преобразования в объект Date, дату можно преобразовать в другой часовой пояс с помощью Utilities.formatDate().

/**
 * Форматирует дату в строку с указанным часовым поясом и форматом.
 * @param {Date} date Объект Date.
 * @param {string} timeZone Часовой пояс.
 * @param {string} format Формат строки.
 * @return {string} Строка даты.
 */
function formatDate(date, timeZone, format) {
  return Utilities.formatDate(date, timeZone, format);
}

var dateString8 = "2023-10-26 10:30:00";
var timeZone8 = "America/Los_Angeles";
var format8 = "yyyy-MM-dd HH:mm:ss";
var date8 = stringToDateUtilities(dateString8, timeZone8, format8);

var newTimeZone = "Europe/Moscow";
var formattedDate = formatDate(date8, newTimeZone, format8);
Logger.log(formattedDate); // 2023-10-26 20:30:00

Важность учета часовых поясов в Google Apps Script

Неправильный учет часовых поясов может привести к серьезным ошибкам в расчетах и отображении дат. Всегда явно указывайте часовой пояс при преобразовании и форматировании дат.

Практические примеры и решения распространенных проблем

Преобразование даты из Google Sheets

Часто даты в Google Sheets хранятся как числа. Перед преобразованием в строку, их необходимо отформатировать.

function getDateFromSheet(sheet, row, column) {
  var dateValue = sheet.getRange(row, column).getValue();
  // Проверяем, является ли значение числом.
  if (typeof dateValue === 'number') {
    // Форматируем число как дату.
    var formattedDate = Utilities.formatDate(new Date(dateValue), Session.getTimeZone(), 'yyyy-MM-dd');
    return formattedDate; // Возвращаем строку, содержащую дату
  } else if (typeof dateValue === 'string') {
    return dateValue; // Если значение - строка, возвращаем как есть
  } else {
    return null; // Если значение не число и не строка, возвращаем null
  }
}

// Пример:
// var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// var dateString9 = getDateFromSheet(sheet, 1, 1); // Получаем дату из ячейки A1
// Logger.log(dateString9);

Работа с датами в форматах, специфичных для региона

Для работы с региональными форматами дат, необходимо использовать Utilities.parseDate() с соответствующим форматом.

// Пример:  Российский формат dd.MM.yyyy
var dateString10 = "26.10.2023";
var timeZone10 = "Europe/Moscow";
var format10 = "dd.MM.yyyy";
var date10 = stringToDateUtilities(dateString10, timeZone10, format10);
Logger.log(date10); // Thu Oct 26 00:00:00 MSK 2023

Создание пользовательских функций для преобразования дат

Для упрощения работы с датами, можно создать пользовательские функции, которые инкапсулируют логику преобразования.

/**
 * Преобразует строку в дату с указанным форматом и часовым поясом.
 * @param {string} dateString Строка даты.
 * @param {string} format Формат даты.
 * @param {string} timeZone Часовой пояс.
 * @return {Date|null} Объект Date или null, если преобразование не удалось.
 */
function parseDateString(dateString, format, timeZone) {
    try {
        return Utilities.parseDate(dateString, timeZone, format);
    } catch (e) {
        Logger.log("Ошибка при преобразовании даты: " + e);
        return null;
    }
}

// Пример использования:
// var dateString = "2024-01-01";
// var format = "yyyy-MM-dd";
// var timeZone = "GMT";
// var date = parseDateString(dateString, format, timeZone);
// if (date) {
//   Logger.log(date); // Mon Jan 01 00:00:00 GMT+00:00 2024
// }

Добавить комментарий