Создать дату с заданным часовым поясом без использования строкового представления

Ваша функция checkElements() не отмечена как const, поэтому вы не можете называть ее на const квалифицированных объектах.

top(), однако, имеет значение const, поэтому в top(), this является указателем на const Stack (даже если экземпляр Stack, на который был вызван top(), оказывается не const), поэтому вы не можете вызвать checkElements(), который всегда требует экземпляр не const.

377
задан Dan 10 September 2018 в 09:17
поделиться

20 ответов

с помощью .setUTCHours() было бы возможно установить даты в UTC-времени, что позволило бы вам использовать UTC-время во всей системе.

Вы не можете установить его, используя UTC в конструкторе, если только вы не укажете строку даты.

Используя new Date(Date.UTC(year, month, day, hour, minute, second)), вы можете создать объект Date из определенного UTC время.

453
ответ дан pkyeck 10 September 2018 в 09:17
поделиться

Это ЛУЧШЕЕ решение

Использование:

// TO ALL dates
Date.timezoneOffset(-240) // +4 UTC

// Override offset only for THIS date
new Date().timezoneOffset(-180) // +3 UTC

Код:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset();

Date.setTimezoneOffset = function(timezoneOffset) {
  return this.prototype.timezoneOffset = timezoneOffset;
};

Date.getTimezoneOffset = function() {
  return this.prototype.timezoneOffset;
};

Date.prototype.setTimezoneOffset = function(timezoneOffset) {
  return this.timezoneOffset = timezoneOffset;
};

Date.prototype.getTimezoneOffset = function() {
  return this.timezoneOffset;
};

Date.prototype.toString = function() {
  var offsetDate, offsetTime;
  offsetTime = this.timezoneOffset * 60 * 1000;
  offsetDate = new Date(this.getTime() - offsetTime);
  return offsetDate.toUTCString();
};

['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'].forEach((function(_this) {
  return function(key) {
    Date.prototype["get" + key] = function() {
      var offsetDate, offsetTime;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      return offsetDate["getUTC" + key]();
    };
    return Date.prototype["set" + key] = function(value) {
      var offsetDate, offsetTime, time;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      offsetDate["setUTC" + key](value);
      time = offsetDate.getTime() + offsetTime;
      this.setTime(time);
      return time;
    };
  };
})(this));

Версия для кофе:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset()


Date.setTimezoneOffset = (timezoneOffset)->
    return @prototype.timezoneOffset = timezoneOffset


Date.getTimezoneOffset = ->
    return @prototype.timezoneOffset


Date.prototype.setTimezoneOffset = (timezoneOffset)->
    return @timezoneOffset = timezoneOffset


Date.prototype.getTimezoneOffset = ->
    return @timezoneOffset


Date.prototype.toString = ->
    offsetTime = @timezoneOffset * 60 * 1000
    offsetDate = new Date(@getTime() - offsetTime)
    return offsetDate.toUTCString()


[
    'Milliseconds', 'Seconds', 'Minutes', 'Hours',
    'Date', 'Month', 'FullYear', 'Year', 'Day'
]
.forEach (key)=>
    Date.prototype["get#{key}"] = ->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        return offsetDate["getUTC#{key}"]()

    Date.prototype["set#{key}"] = (value)->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        offsetDate["setUTC#{key}"](value)
        time = offsetDate.getTime() + offsetTime
        @setTime(time)
        return time
-9
ответ дан Maxmaxmaximus 10 September 2018 в 09:17
поделиться

Это сработало для меня. Не уверен, что это хорошая идея.

var myDate = new Date();
console.log('myDate:', myDate);   // myDate: "2018-04-04T01:09:38.112Z"

var offset = '+5';  // e.g. if the timeZone is -5

var MyDateWithOffset = new Date( myDate.toGMTString() + offset );   

console.log('MyDateWithOffset:', MyDateWithOffset); // myDateWithOffset: "2018-04-03T20:09:38.000Z"
-1
ответ дан Stephen Rauch 10 September 2018 в 09:17
поделиться

Я использовал пакет timezone-js.

var timezoneJS  = require('timezone-js');
var tzdata = require('tzdata');

::

createDate(dateObj) {
    if ( dateObj == null ) {
        return null;
    }
    var nativeTimezoneOffset = new Date().getTimezoneOffset();
    var offset = this.getTimeZoneOffset();

    // use the native Date object if the timezone matches
    if ( offset == -1 * nativeTimezoneOffset ) {
        return dateObj;
    }

    this.loadTimeZones();

    // FIXME: it would be better if timezoneJS.Date was an instanceof of Date
    //        tried jquery $.extend
    //        added hack to Fiterpickr to look for Dater.getTime instead of "d instanceof Date"
    return new timezoneJS.Date(dateObj,this.getTimeZoneName());
},
-1
ответ дан Stephen Ince 10 September 2018 в 09:17
поделиться

Лучшее решение, которое я видел из этого, пришло из

http://www.codingforums.com/archive/index.php/t-19663.html

Функция времени печати

<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
    offset++;
    tempDate = new Date()
    tempDate.setTime(UTCDate.getTime()+3600000*(offset))
    timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
    timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
    timeValue += " hrs."
    return timeValue
    }
    var now = new Date()
    var seed = now.getTime() % 0xfffffff
    var same = rand(12)
</script>

Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>

Пример полного кода

<html>

<head>
<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
offset++;
tempDate = new Date()
tempDate.setTime(UTCDate.getTime()+3600000*(offset))
timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
timeValue += " hrs."
return timeValue
}
var now = new Date()
var seed = now.getTime() % 0xfffffff
var same = rand(12)
</script>

</head>

<body>
Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>
<br>
Michigan:
<script language="JavaScript">document.write(printTime("-5"))</script>
<br>
Greenwich, England(UTC):
<script language="JavaScript">document.write(printTime("-0"))</script>
<br>
Tokyo, Japan:
<script language="JavaScript">document.write(printTime("+9"))</script>
<br>
Berlin, Germany:
<script language="JavaScript">document.write(printTime("+1"))</script>

</body>
</html>
1
ответ дан Jeffrey L. Roberts 10 September 2018 в 09:17
поделиться

Этот код вернет ваш объект Date , отформатированный в часовом поясе браузера .

Date.prototype.timezone = function () {
    this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60));
    return this;
}
2
ответ дан Marco Dal Zovo 10 September 2018 в 09:17
поделиться

любой пробег в

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();
2
ответ дан meouw 10 September 2018 в 09:17
поделиться
// My clock 2018-07-25, 00:26:00 (GMT+7)
let date = new Date(); // 2018-07-24:17:26:00 (Look like GMT+0)
const myTimeZone = 7; // my timeZone 
// my timeZone = 7h = 7 * 60 * 60 * 1000 (millisecond);
// 2018-07-24:17:26:00 = x (milliseconds)
// finally, time in milliseconds (GMT+7) = x + myTimezone 
date.setTime( date.getTime() + myTimeZone * 60 * 60 * 1000 );
// date.toISOString() = 2018-07-25, 00:26:00 (GMT+7)
5
ответ дан Tuan Nguyen 10 September 2018 в 09:17
поделиться

getTimeZoneOffset является минусом для UTC + z.

var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}
7
ответ дан rinjan 10 September 2018 в 09:17
поделиться
d = new Date();
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
nd = new Date(utc + (3600000*offset));

offset value base on which location time zone you would like to set 
For India offset value +5.5,
New York offset value -4,
London offset value +1

для всех смещений местоположения Wiki Список смещений времени UTC

13
ответ дан Vijay Lathiya 10 September 2018 в 09:17
поделиться

Полагаю, вам нужна функция createDateAsUTC (сравните с convertDateToUTC )

function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}

function convertDateToUTC(date) { 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 
}
.
158
ответ дан falsarella 10 September 2018 в 09:17
поделиться

Решение одной строкой

new Date(new Date(1422524805305).getTime() - 330*60*1000)

Вместо 1422524805305 используйте метку времени в миллисекундах Вместо 330, используйте смещение часового пояса в минутах по отношению к минутам. Время по Гринвичу (например, Индия +5: 30 - 5 * 60 + 30 = 330 минут)

9
ответ дан Vinay Vemula 10 September 2018 в 09:17
поделиться

Просто установите часовой пояс и вернитесь согласно

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})
20
ответ дан Matee Gojra 10 September 2018 в 09:17
поделиться

Я знаю, что это старо, но если это поможет, вы можете использовать момент и часовой пояс. Если вы не видели их, посмотрите.

http://momentjs.com/timezone/

http://momentjs.com/

два действительно удобные библиотеки манипулирования временем.

17
ответ дан Phillip Senn 10 September 2018 в 09:17
поделиться
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

Этот ответ специально разработан для исходного вопроса и не даст того ответа, который вы ожидаете. В частности, некоторые люди захотят вычесть смещение часового пояса, а не добавить его. Помните, однако, что весь смысл этого решения состоит в том, чтобы взломать объект даты в javascript для конкретной десериализации, а не во всех случаях.

188
ответ дан T.W.R. Cole 10 September 2018 в 09:17
поделиться

Это может помочь кому-то, поставить UTC в конце того, что вы передаете новому конструктору

По крайней мере, в chrome вы можете сказать var date = new Date("2014-01-01 11:00:00 UTC")

8
ответ дан Drew LeSueur 10 September 2018 в 09:17
поделиться

Если вы хотите решить немного другую, но связанную проблему создания объекта Javascript Date из года, месяца, дня, ..., , включая часовой пояс - то есть, если вы хотите разберите строку в Date - тогда вам, очевидно, придется исполнить невероятно сложный танец:

// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34"              -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56"           -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78"        -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100"   -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530"   -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330"   -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330"      -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z"          -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
    var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
    var m = timebits.exec(dateString);
    var resultDate;
    if (m) {
        var utcdate = Date.UTC(parseInt(m[1]),
                               parseInt(m[2])-1, // months are zero-offset (!)
                               parseInt(m[3]),
                               parseInt(m[4]), parseInt(m[5]), // hh:mm
                               (m[6] && parseInt(m[6]) || 0),  // optional seconds
                               (m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
        // utcdate is milliseconds since the epoch
        if (m[9] && m[10]) {
            var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
            utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
        }
        resultDate = new Date(utcdate);
    } else {
        resultDate = null;
    }
    return resultDate;
}

То есть вы создаете «время UTC», используя дату без часового пояса (так что вы знаете, в какой локали она находится а именно «локаль» UTC, а не локальная по умолчанию), а затем вручную примените указанное смещение часового пояса.

Не было бы неплохо, если бы кто-то на самом деле думал об объекте даты Javascript более, чем, ооо, пять минут…

16
ответ дан Norman Gray 10 September 2018 в 09:17
поделиться

Самый простой способ найти правильную дату - использовать datejs.

http://www.datejs.com/

Я получаю свои даты через Ajax в этом формате в виде строки: '2016-01-12T00: 00: 00 '

var yourDateString = '2016-01-12T00:00:00';
var yourDate = new Date(yourDateString);
console.log(yourDate);
if (yourDate.getTimezoneOffset() > 0){
    yourDate = new Date(yourDateString).addMinutes(yourDate.getTimezoneOffset());
}
console.log(yourDate);

Консоль будет читать:

Пн 11 января 2016 19:00:00 GMT-0500 (Восточное стандартное время)

Вт 12 января 2016 00: 00:00 GMT-0500 (восточное стандартное время)

https://jsfiddle.net/vp1ena7b/3/

«addMinutes» происходит от datejs, вы Возможно, я мог бы сделать это в чистом js самостоятельно, но у меня уже был datejs в моем проекте, поэтому я нашел способ использовать его, чтобы получить правильные даты.

Я думал, что это может кому-то помочь ...

5
ответ дан Barry Franklin 10 September 2018 в 09:17
поделиться

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

И в некотором смысле это имеет смысл - концептуально (если, возможно, не в реализации); за http://en.wikipedia.org/wiki/Unix_timestamp (выделение мое):

Время Unix, или время POSIX, представляет собой систему для описания моментов во времени, определяется как количество секунд, прошедших с полуночи Всемирное координированное время (UTC) четверга, 1 января 1970 года.

После того, как вы его построите, он будет представлять определенную точку в «реальном» времени. Часовой пояс имеет значение только тогда, когда вы хотите преобразовать этот абстрактный момент времени в удобочитаемую строку.

Таким образом, имеет смысл, что вы сможете изменить только фактическое время, которое Date представляет в конструкторе. К сожалению, кажется, что нет никакого способа передать в явном часовом поясе - и конструктор, который вы вызываете (возможно, правильно), переводит ваши «локальные» переменные времени в GMT, когда он канонически сохраняет их - поэтому нет способа использовать int, int, int конструктор для времени по Гринвичу.

С другой стороны, тривиально просто использовать конструктор, который принимает строку. Вам даже не нужно конвертировать числовой месяц в строку (по крайней мере, в Firefox), поэтому я надеялся, что наивная реализация сработает. Тем не менее, после его тестирования он успешно работает в Firefox, Chrome и Opera, но не работает в Konqueror («Неверная дата»), Safari («Неверная дата») и IE («NaN»). Я полагаю, у вас просто есть массив поиска для преобразования месяца в строку, например:

var months = [ '', 'January', 'February', ..., 'December'];

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}
25
ответ дан Andrzej Doyle 10 September 2018 в 09:17
поделиться

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

  const currTimezone = new Date().getTimezoneOffset(); // your timezone
  const newDateTimezone = date.getTimezoneOffset(); // date with unknown timezone

  if (currTimezone !== newDateTimezone) {
    // and below you are checking if difference should be - or +. It depends on if unknown timezone is lesser or greater than yours
    const newTimezone = (currTimezone - newDateTimezone) * (currTimezone > newDateTimezone ? 1 : -1);
    date.setTime(date.getTime() + (newTimezone * 60 * 1000));
  }
0
ответ дан 22 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: