繁体   English   中英

日期-每天的特定时间,特定的时区

[英]Date - specific time each day, specific timezone

**更新**

如果可以,使用moment.js可以吗? 我要做的就是显示一个倒数计时器,该倒数计时器每天PST(6EST)下午3点。


寻找一种方法让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/

仍然无法正常工作...我只需要每天倒数到太平洋标准时间(6EST)下午3点...而无需尝试根据用户所在的时区在用户端进行计算,例如是否可以通过GMT进行计算,那可能会起作用吗? 但这甚至可能。

也许是这样的组合? https://jsfiddle.net/salman/PxzJu/

一种解决方法是为当前日期和格林尼治标准时间-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, eg 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 (ie 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 (ie "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(); } 

setUTCHours()方法根据UTC时间设置日期对象的小时。

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

这是文档: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours

或者, getUTChours根据通用时间返回小时:

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

这是文档: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours

您可以在日期上使用getUTCHours()setUTCHours()函数来获取/设置基于UTC小时而不是本地时间的小时。 例如

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个小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM