Отметка времени записи в блоге.
Мой проект Фазы 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"