Create a Date with a set timezone without using a string representation

前端 未结 23 1113
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 01:48

I have a web page with three dropdowns for day, month and year. If I use the JavaScript Date constructor that takes numbers, then I get a Date obje

23条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-22 02:09

    This is BEST solution

    Using:

    // TO ALL dates
    Date.timezoneOffset(-240) // +4 UTC
    
    // Override offset only for THIS date
    new Date().timezoneOffset(-180) // +3 UTC
    

    Code:

    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));
    

    Coffee version:

    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
    

提交回复
热议问题