Как лучше всего переносить даты туда и обратно на Javascript в часовом поясе сервера?

У меня есть дата и время, хранящиеся в базе данных на сервере, которые обозначают начало выступления.

Мы можем предположить, что часовой пояс в месте проведения выступления тот же, что и на веб-сервере и сервере базы данных - то есть, если написано «Представление начинается в 19:00», это обязательно и очевидно является локальным для выступления.

Если я хочу отправить эту дату на веб-страницу в ответ на вызов AJAX и отправить данные обратно вместе с другой, чтобы ее мог редактировать кто-то, ответственный за организацию мероприятия, я все равно хочу, чтобы она была локальной для выступления. Если представление проходит в Мельбурне, а я настраиваю его в Лондоне, мне не нужно вводить 9:00 в поле времени, потому что 9:00 в Лондоне — это 19:00 в Мельбурне. Если я просматриваю список «времени выступлений» на веб-странице, я все равно хочу, чтобы там было указано 19:00, независимо от того, нахожусь ли я в Лондоне или Мельбурне; местное время для меня не имеет значения.

Но если я получу дату в формате JSON из моего вызова AJAX с надписью /Date(1714122000000+1000)/, то есть 19:00 в Мельбурне, что правильно, и превращу ее в объект даты Javascript, я не смогу НЕ отображать его в местном часовом поясе. Если я добавлю смещение часового пояса к объекту Date, чтобы он отображал 19:00, когда я нахожусь в Лондоне, то, когда я отправлю время обратно на сервер, это будет неправильно, и мне придется снова корректировать его по смещению, что чувствует себя грязно.

Каков наилучший способ передачи дат туда и обратно в браузер, игнорируя часовой пояс браузера?

Я пробовал: момент, люксон, собственные объекты даты. Я не пробовал: катить свой собственный объект обработки даты и времени, потому что я не сумасшедший.

Я создал модуль даты и времени с поддержкой локали . Возможно, это полезно для вашей проблемы.

KooiInc 26.04.2024 13:16

Вы ошибаетесь насчет того, как всем этим управляют в ИТ. В цифровом мире дата и время основаны исключительно на всемирном времени. представление этого значения в выбранном вами TZ (часовом поясе) легко выполняется с помощью JavaScript.

Mister Jojo 26.04.2024 14:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самым простым, вероятно, будет сериализация отметки времени в виде строки без информации о часовом поясе.

Потому что всякий раз, когда у вас есть временная метка unix (т. е. секунды или миллисекунды от 1970-01-01:00:00Z), у вас есть уникальный момент времени, который является одним и тем же моментом времени (но не обязательно одним и тем же временем суток) повсюду. мир.

Кажется, вы хотите наоборот: в одно и то же время суток, независимо от вашего текущего местоположения/часового пояса.

тоесть что-то вроде

{
  ...
  date: "2024-04-26T19:00",
  ...
}

потому что тогда на стороне клиента, когда эта дата передается в new Date("2024-04-26T19:00"), она интерпретируется в соответствии с местным часовым поясом, то есть всегда будет 19:00, независимо от часового пояса, в котором работает браузер. Затем вы можете изменить дату на любую вы хотите.

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

{
  ...
  "date": "2024-04-26T19:30",
  ...
}

И на бэкэнде сделайте то же самое, передайте это date в new Date("2024-04-26T19:30"), и оно будет интерпретироваться в любом часовом поясе, в котором работает бэкэнд...

Да, это упростило бы ситуацию. Если бы только было просто убедить Microsoft DataContractJsonSerializer не использовать этот дурацкий формат /Date(1329159196126-0500)/!

Ben Curthoys 29.04.2024 11:24

Мне удалось заставить это работать так, как я хочу, с Luxon. Luxon позволит мне сохранить часовой пояс в объекте DateTime и не преобразовывать его постоянно в местное время. Однако мне нужно иметь глобальную переменную для часового пояса сервера на странице, чтобы я знал, в каком часовом поясе создавать новый DateTime, созданный из строк в полях ввода.

luxon.Settings.defaultZoneName = _DefaultTimeZoneName;

function fromJSONtoLuxonDate(jsonDate) {
    if (jsonDate === null) {
        return null;
    } else if (jsonDate == '') {
        return null;
    } else if (jsonDate.substr(0, 6) === '/Date(') {
        var dateValue; var timeZoneValue;

        var i = jsonDate.lastIndexOf(')/');
        dateValue = jsonDate.substr(6, i - 6);

        if (dateValue.includes('+')) {
            i = dateValue.indexOf('+');
            timeZoneValue = dateValue.substr(i);
            dateValue = Number(dateValue.substr(0, i));
        }

        var luxonDate = luxon.DateTime.fromMillis(dateValue, { zone: timeZoneValue });
        console.info("Converted " + jsonDate + " to ", luxonDate);
        return luxonDate;
    }
}

function fromLuxonDateToJSONDate(luxonDate) {
    var jsonDate = "/Date(" + luxonDate.toFormat("x") + luxonDate.toFormat("ZZZ") + ")/";
    // console.info("Converted " + luxonDate.toLocaleString(luxon.DateTime.DATETIME_FULL) + " to " + jsonDate);
    return jsonDate;
}

function fromStringsToJSONDate(dateString, timeString) {
    if (dateString != '') {

        var luxonDate = luxon.DateTime.fromFormat(dateString, 'dd/MM/yyyy', { zone: _DefaultTimeZoneOffset });

        if (timeString != '') {
            var luxonTime = luxon.DateTime.fromISO(timeString);
            luxonDate = luxonDate.set({ hour: luxonTime.hour, minute: luxonTime.minute })
        }

        return fromLuxonDateToJSONDate(luxonDate);
    }
    else {
        return null;
    }
}

За (временную) цену жесткого кодирования формата даты там. Но эту проблему решить проще.

Другие вопросы по теме