使用moment.js会没问题,如果这样会更容易吗? 所有我想做的就是显示一个倒数计时器,倒数到太平洋标准时间每天下午3点(6EST)。
寻找一种方法让javascript获得新的Date()以使用特定的时间zome,而不是用户的时间。
我有:
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)...而不是试图根据他们的时区在用户端计算它,就好像可以从GMT计算,这可能有用吗?但这是可能的。
也许是这样的组合? https://jsfiddle.net/salman/PxzJu/
答案 0 :(得分:1)
解决此问题的一种方法是为当前日期创建日期,并在时区GMT-0800创建15:00。如果已经通过,请为其添加一天。如果它将来超过1天(不太可能在西区的时区),那么减去一天。
然后从中减去当前时间以获得到下一个15:00 PST的毫秒数。
以下使用了一些辅助函数,最大的是 parseISO 来解析ISO 8601日期字符串,以避免内置的Date解析器进行解析。 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} dates 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();
}
&#13;
答案 1 :(得分:0)
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
答案 2 :(得分:0)
您可以使用日期上的getUTCHours()和setUTCHours()功能来根据UTC小时数而非当地小时数来获取/设置小时数。 E.g。
var date = new Date();
date.setUTCHours(5);
或者,更好的是,您可以使用getTimezoneOffset()功能来显示差异并计算并调整回UTC,或者您想要的时区。注意,偏移量以 MINUTES 返回。
var date = new Date();
var offset = date.getTimezoneOffset();
console.log(offset);
上面的输出是300
,因为我在CST(严格来说,CDT),目前比UTC晚了5个小时。