конвертировать дату на основе часового пояса пользователя - PullRequest
0 голосов
/ 24 апреля 2019

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

Например, я хочу установить его по времени EST (Америка / Нью-Йорк)

2019-04-24 12:00:00

и если пользователь попадает на сайт из Америки / Los_Angeles, он будет отображаться:

2019-04-24 09:00:00

Мне нужно иметь возможность вернуть час, поэтому в этом примере: 9.

Я пытался использовать https://github.com/iansinnott/jstz для определения их часового пояса и https://moment.github.io/luxon в надежде на преобразование без какой-либо удачи.

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

Ответы [ 5 ]

0 голосов
/ 25 апреля 2019

Я думаю, что вопрос, возможно, нуждается в дополнительном разъяснении - мое первое впечатление было то, что вы ссылаетесь на дату и время, которые у вас уже есть и служат с сервера.Не сводится ли эта проблема к тому, что объект Date «осведомлен о часовом поясе пользователя»?или нет?Но это (некоторые методы, если быть точным)

Ваша дата / время 2019-04-24 12:00:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ (я предполагаю, что PM). Это означает, что метка времени Unix этого в миллисекундах равна 1556121600000 (я предполагаю, что дневной свет включен в апреле, поэтому не чистое EST, а EDT и смещение UTC-4: 00)

Когда вы звоните

console.log(new Date(1556121600000).getHours())

разве это не возвращает 9, как вы предлагаете, для Javascript, выполняемого в браузере из Америки / Los_Angeles с часовым поясом PDT?

Как указано в https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours:

Метод getHours () возвращает час для указанной даты в соответствии с местным временем.

0 голосов
/ 25 апреля 2019

Звучит так, как будто вы просите преобразовать из определенного часового пояса в местный часовой пояс пользователя (каким бы он ни был). Для этого вам не требуется обнаружение часового пояса, но в настоящее время вам do нужна библиотека. (Ответы, которые предлагают использовать toLocaleString с параметром часового пояса, неверны, так как эта функция преобразует в определенного часового пояса, но не может идти в другом направлении.)

Поскольку вы упомянули Luxon , я дам конкретный ответ Luxon:

luxon.DateTime.fromFormat('2019-04-24 12:00:00',       // the input string
                          'yyyy-MM-dd HH:mm:ss',       // the format of the input string
                          { zone: 'America/New_York'}) // the time zone of the input
              .toLocal()                               // convert to the user's local time
              .toFormat('yyyy-MM-dd HH:mm:ss')         // return a string in the same format

//=>  "2019-04-24 09:00:00"

Эта возможность также предоставляется другими библиотеками, такими как date-fns-timezone , js-Joda или Moment-Timezone , но это что-то еще не встроено в JavaScript.

0 голосов
/ 24 апреля 2019

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

var date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));

// toLocaleString() without arguments depends on the implementation,
// the default locale, and the default time zone
console.log(date.toLocaleString());
// → "12/11/2012, 7:00:00 PM" if run in en-US locale with time zone America/Los_Angeles

Или вы можете использовать getYear, getMonth, getDate, getHours, getMinutes, getSeconds, чтобы отформатировать собственное представление даты. Все эти методы возвращают значения в соответствии с местным часовым поясом пользователя.

0 голосов
/ 24 апреля 2019

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

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())


var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles"});
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())
0 голосов
/ 24 апреля 2019

Вы можете хранить список идентификаторов тимзеона и список их соответствующего +/- количества часов относительно вашего местного времени (которое возвращается вашей функцией времени).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...