Дата - конкретное время каждый день, конкретный часовой пояс

** ОБНОВИТЬ**

с помощью moment.js было бы хорошо, если бы это было проще? все, что я хочу сделать, это отобразить таймер обратного отсчета, который ведет обратный отсчет до 15:00 по тихоокеанскому времени (6EST) ежедневно.

Ищите способ, чтобы javascript получал новый Date (), чтобы использовать определенное время, а не время пользователя.

Я имею:

function ShowTime()  {
  var now = new Date();
  var hrs = 14-now.getHours();
  var mins = 59-now.getMinutes();
  var secs = 59-now.getSeconds();
      timeLeft etc etc...

jsfiddle (работает), но я думаю, что это время моей собственной машины:http://jsfiddle.net/36sqeq8x/

все еще не работает ... Мне просто нужно считать до 3 часов дня по тихоокеанскому времени (6EST) ежедневно ... не пытаясь рассчитать его по конечным пользователям в зависимости от их часового пояса, как если бы можно было рассчитать по Гринвичу, что могло бы сработать? но это даже возможно.

может быть сочетание чего-то вроде этого?https://jsfiddle.net/salman/PxzJu/

 putvande10 июн. 2016 г., 16:57
Насколько я знаю, вы не можете сделать это с JS. Это всегда получит время пользователей. У вас может быть смещение часового пояса, но в противном случае вы будете придерживаться времени пользователя.

Ответы на вопрос(3)

Вы можете использоватьgetUTCHours () а такжеsetUTCHours () функции на дату, чтобы получить / установить часы на основе часов UTC вместо местных часов. Например.

var date = new Date();
date.setUTCHours(5);

Или, лучше, вы можете использоватьgetTimezoneOffset () функция, чтобы показать разницу и рассчитать и скорректировать обратно к UTC, или какой часовой пояс вы хотите. NB смещение возвращается вПРОТОКОЛ.

var date = new Date();
var offset = date.getTimezoneOffset();
console.log(offset);

Мой вывод на выше300Я нахожусь в CST (строго говоря, CDT), который на 5 часов отстает от UTC.

Метод setUTCHours () устанавливает час объекта даты в соответствии с временем UTC.

var d = new Date();
d.setUTCHours(15);

Вот документация:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours

С другой стороны,getUTChours вернуть час по общему времени:

var d = new Date();
var n = d.getUTCHours();

Вот документация:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours

 M2110 июн. 2016 г., 17:13
Я вижу 6 часов 47 минут
 Gerardo Furtado10 июн. 2016 г., 17:11
Здесь, в Австралии, я вижу "13 часов 49 минут" в твоей скрипке ... что ты видишь?
 M2110 июн. 2016 г., 17:07
Я читаю эту документацию, в основном я пытаюсь отсчитывать до 6 вечера EST - каждый день.

Один из способов сделать это - создать дату для текущей даты и 15:00 в часовом поясе GMT-0800. Если это уже прошло, добавьте день к нему. Если в будущем будет более 1 дня (маловероятно, что в часовом поясе так далеко на западе), то вычтите день.

Затем вычтите текущее время из этого, чтобы получить миллисекунды до следующих 15:00 PST.

Следующее использует некоторые вспомогательные функции, самый большойparseISO проанализировать строку даты ISO 8601, чтобы избежать синтаксического анализа встроенным анализатором даты.toISODate используется для построения строки для 15:00 PDT, остальные только для вывода. Надеюсь, документации и комментариев достаточно.

// Create a date for the current date at 15:00 PST (UTC-0800)
// Current date and time
var dLocal = new Date();
// Create Date for same date but time 15:00 at UTC-0800
var dPST  = parseISO(toISODate(dLocal) + 'T' + '15:00:00-0800');

// If dPST has passed, add a day
if (dPST < dLocal) dPST.setDate(dPST.getDate() + 1);
// If gap is too big, subtract a day
if (dPST - dLocal > 8.64e7) dPST.setDate(dPST.getDate() - 1);

console.log('Current local: '   + toISOString(dLocal) + 
            '\nCurrent PST:   ' + toISOStringOffset(-480, dLocal) + 
            '\nNext 3pm PST in PST zone: ' + toISOStringOffset(-480, dPST) +
            '\nNext 3pm PST in local zone: ' + toISOString(dPST) +
            '\nms to 3pm PST: ' + (dPST - dLocal)
);



/* Parse ISO date string in format yyyy-mm-ddThh:mm:ss.sss+hh:mm or Z
** @param (string} s - string to parse in ISO 8601 extended format
**                     yyyy-mm-ddThh:mm:ss.sss+/-hh:mm or z
**                     time zone can omit separator, so +05:30 or +0530
** @returns {Date}   - returns a Date object. If any value out of range,
**                     returns an invalid date.
*/
function parseISO(s) {
  // Create base Date object
  var date = new Date();
  var invalidDate = new Date(NaN);
  // Set some defaults
  var sign = -1, tzMins = 0;
  var tzHr, tzMin;
  // Trim leading and trailing whitespace
  s = s.replace(/^\s*|\s*$/g,'').toUpperCase();
  // Get parts of string and split into numbers
  var d  = (s.match(/^\d+(-\d+){0,2}/)             || [''])[0].split(/\D/);
  var t  = (s.match(/[\sT]\d+(:\d+){0,2}(\.\d+)?/) || [''])[0].split(/\D/);
  var tz = (s.match(/Z|[+\-]\d\d:?\d\d$/)          || [''])[0];

  // Resolve timezone to minutes, may be Z, +hh:mm or +hhmm
  // Splitting into parts makes validation easier
  if (tz) {
    sign  = /^-/.test(tz)? 1 : -1;
    tzHr  = tz == 'Z'? 0 : tz.substr(1,2);
    tzMin = tz == 'Z'? 0 : tz.substr(tz.length - 2, 2)*1;
    tzMins = sign * (tzHr*60 + tzMin);
  }

  // Validation
  function isLeap(year){return year % 4 != 0 || year % 100 == 0 && year % 400 != 0}
  // Check number of date parts and month is valid
  if (d.length > 3 || d[1] < 1 || d[1] > 12) return invalidDate;
  // Test day is valid
  var monthDays = [,31,28,31,30,31,30,31,31,30,31,30,31];
  var monthMax = isLeap(d[0]) && d[1] == 2? 29 : monthDays[d[1]];
  if (d[2] < 1 || d[1] > monthMax) return invalidDate;
  // Test time parts
  if (t.length > 5 || t[1] > 23 || t[2] > 59 || t[3] > 59 || t[4] > 999) return invalidDate;
  // Test tz within bounds
  if (tzHr > 12 || tzMin > 59) return invalidDate;

  // If there's a timezone, use UTC methods, otherwise local
  var method = tz? 'UTC' : '';
  
  // Set date values
  date['set' + method + 'FullYear'](d[0], (d[1]? d[1]-1 : 0), d[2]||1);
  // Set time values - first memeber is '' from separator \s or T
  date['set' + method + 'Hours'](t[1] || 0, (+t[2]||0) + tzMins, t[3]||0, t[4]||0);

  return date;
}

/* Return ISO 8601 formatted string with local offset, e.g. 2016-06-12T12:43:23.432+05:30
** @param {Date} d - date to craete string from
** @returns {string} in ISO 8601 format with offset
*/
function toISOString(d) {
  d = d || new Date();
  var offset = d.getTimezoneOffset();
  function z(n){return (n<10?'0':'') + n}
  // Reverse signe of offset to be consistent with ISO 8601
  var offSign = offset < 0? '+' : '-';
  offset = Math.abs(offset);
  var offHr  = z(offset/60 | 0);
  var offMin = z(offset%60);
  return d.getFullYear() + '-' + z(d.getMonth() + 1) + '-' + z(d.getDate()) + 'T' +
         z(d.getHours()) + ':' + z(d.getMinutes()) + ':' + z(d.getSeconds()) + '.' +
         ('00' + d.getMilliseconds()).slice(-3) + offSign + offHr + ':' + offMin;
}

/* Given a Date, return an ISO 8601 formatted date and time string
** for a particular time zone.
** @param {number} offset - offset in minutes +east, -west, default is local
** @param {Date} d - date to use, default is now
** @returns {string} ISO 8601 formatted string for supplied time zone offset
*/
function toISOStringOffset(offset, d) {
  // Copy date if supplied or use now
  d = d? new Date(+d) : new Date();
  // Prepare offset values
  offset = offset || -d.getTimezoneOffset();
  var offSign = offset < 0? '-' : '+'; 
  offset = Math.abs(offset);
  var offHours = ('0' + (offset/60 | 0)).slice(-2);
  var offMins  = ('0' + (offset % 60)).slice(-2);

  // Apply offset to d
  d.setUTCMinutes(d.getUTCMinutes() - offset);

  // Return formatted string
  return d.getUTCFullYear() + 
    '-' + ('0' + (d.getUTCMonth()+1)).slice(-2) + 
    '-' + ('0' + d.getUTCDate()).slice(-2) + 
    'T' + ('0' + d.getUTCHours()).slice(-2) + 
    ':' + ('0' + d.getUTCMinutes()).slice(-2) + 
    ':' + ('0' + d.getUTCSeconds()).slice(-2) + 
    '.' + ('000' + d.getUTCMilliseconds()).slice(-3) +
    offSign + offHours + ':' + offMins; 
}

/* Return an ISO 8601 formatted date string based on local time
** Year must be positive (i.e. doesn't do -ve year)
** @param {Date} date - date object to create date string from
** @returns {string} d,ates string in yyyy-mm-dd format or default from
**                   Date.prototype.toString (i.e. "Invalid Date")
*/
function toISODate(date) {
  return date.getDate()? ('000' + date.getFullYear()).slice(-4) + '-' +
                         ('0' + (date.getMonth() + 1)).slice(-2) + '-' +
                         ('0' + date.getDate()).slice(-2) : date.toString();
}

 RobG14 июн. 2016 г., 02:23
@ M21 - есть другие библиотеки, кроме moment.js, которые намного меньше, проверьте на GitHub (например,fecha.js). Просто замените функции в ответе выше эквивалентами из библиотек. Просто помните, что при разборе строки даты вы всегда должны предоставлять формат анализатору.
 M2113 июн. 2016 г., 18:14
Я собираюсь отметить это принятие, так как считаю, что оно содержит ответ. и документация потрясающая, определенно буду пытаться учиться на ней, к сожалению, я не могу понять, как объединить ее с моим таймером обратного отсчета. Возможно ли это / легче сделать с помощью moment.js? Я не хотел этого делать, но?
 RobG15 июн. 2016 г., 22:45
@ M21 - параметры даты интерпретируются как год 3 и месяц 0 (январь), для всех остальных параметров по умолчанию установлено значение 0 (или 1 для даты), поэтому вы создаете дату для 1 января 0003 в 00:00:00. В «ч: мм» «ч» означает 12-часовое время, но вы не запросили индикатор «am / pm», поэтому время - 12:00 (т.е. полночь в начале дня).
 M2115 июн. 2016 г., 19:57
Феха действительно круто! - Я не могу заставить его работать хотя бы какое-то время ... а также на это время в определенном часовом поясе fecha.format (новая дата (03, 00), 'ч: мм'); ---- это возвращает 12:00 независимо от того, какое значение я использую, например, 03, 04 и т. д

Ваш ответ на вопрос