Отметка времени записи в блоге.

Мой проект Фазы 2 — это веб-приложение для хостинга блогов. При отправке каждая запись в блоге получает 14-значную метку времени, которая добавляется к ее объекту POSTed, чтобы сделать возможной сортировку с целью отображения записей в порядке появления новых. Отметка времени предназначена для того, чтобы избежать использования идентификатора объекта в качестве средства сортировки, и хранится в виде строки. Он генерируется с использованием конструктора JavaScript Date() и некоторой интерполяции строк.

const currentDate = new Date();

    const year = currentDate.getFullYear();
    const month = ("0" + (currentDate.getMonth() + 1)).slice(-2);
    const day = ("0" + currentDate.getDate()).slice(-2);
    const hours = ("0" + currentDate.getHours()).slice(-2);
    const minutes = ("0" + currentDate.getMinutes()).slice(-2);
    const seconds = ("0" + currentDate.getSeconds()).slice(-2);

    const dateTimeString = `${year}${month}${day}${hours}${minutes}${seconds}`

Результат:

"timeStamp": "20230114080507"

Временная метка выглядит следующим образом: 4-значный год, за которым следуют 2-значные наборы: месяц, дата, час (в 24-часовом формате), минуты и секунды. Он существует в виде строки, а не числа, потому что нули должны предшествовать однозначным числам во всех различных наборах, в которых они могут встречаться. (06 вместо 6)

Я хотел, чтобы каждая запись в блоге показывала свою временную метку, но была читабельной. Таким образом, когда отображается каждая «карточка» блога, функция создает сообщение о дате и времени, полученное из метки времени, которое затем прикрепляется к карточке и указывает момент ее отправки.

    const year = string.slice(0,4)
    const month = string.slice(4,6)
    const day = string.slice(6,8)
    const hour = string.slice(8,10)
    const minute = string.slice(10,12)
    const second = string.slice(12,14)

Одна из возникших проблем заключалась в добавлении суффикса к номеру дня. (1, 15, 22, 23 и т.д.)

function attachSuffix(num) {
      const parsedNum = parseInt(num)
    if (parsedNum === 1 || parsedNum === 21 || parsedNum === 31) {
      return parsedNum + "st";
    } else if (parsedNum === 2 || parsedNum === 22) {
      return parsedNum + "nd";
    } else if (parsedNum === 3 || parsedNum === 23) {
      return parsedNum + "rd";
    } else {
      return parsedNum + "th";
    }
  }
    const dayWithSuffix = attachSuffix(day)

Еще одним интересным препятствием был тот факт, что 24-часовой формат нужно было преобразовать в 12-часовой формат, а «00» на самом деле «12» (полночь).

 function parseHourNumber(string) {
        if (string === "00") {
          return 12
        } else {
          return parseInt(string)
        }
      }
  
    const hourNumber = parseHourNumber(hour)
  
    function regularTime(num) {
      if (num > 12) {
        return (num - 12)
      } else {
        return num
      }
        }
  
    const regularTimeNumber = regularTime(hourNumber)

AM или PM взяты из 24-часовой строки, а не из недавно созданного невоенного формата часов.

function antiPost(string) {

        const parsedString = parseInt(string)
    
        if (parsedString < 12) {
          return "AM"
        } else {
          return "PM"
        }
      }
  
    const halfOfDay = antiPost(hour)

Вместо того, чтобы писать if-else для каждого месяца, я загрузил название каждого месяца в виде строки в массив и использовал этот массив для определения месяца записи, полученного из его номера месяца.

  const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  
  const monthName = monthNames[month - 1];

Эта функция, пусть и не очень длинная, в конечном итоге выдает удобочитаемое сообщение о дате и времени, полученное из 14-значной метки времени, которое само по себе сортируется с помощью математики вместо необходимости сортировки по идентификационному номеру объекта.

return `Submitted: ${monthName} ${dayWithSuffix} ${year} at ${regularTimeNumber}:${minute}:${second} ${halfOfDay}`

"Отправлено: 14 января 2023 г., 08:05:07"