2016-03-19 30 views
0
var today = new Date(); 
     jQuery(function() { 
     var preferences_clock_hide = isPreferenceOn('preferences_clock'); 
     if (!preferences_clock_hide) { 
      if(today.dst()){ 
      jQuery('.server-time').countdown({since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), compact: true, format: 'HMS', timezone: -4}); 
     }else{ 
      jQuery('.server-time').countdown({since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), compact: true, format: 'HMS', timezone: -5}); 
     } 
    } 
}); 
     Date.prototype.stdTimezoneOffset = function() { 
      var jan = new Date(this.getFullYear(), 0, 1); 
      var jul = new Date(this.getFullYear(), 6, 1); 
      return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 
     } 

     Date.prototype.dst = function() { 
      return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
     } 

如果我们在DST中,这段代码应该改变时间,但显然.dst()并不为真,尽管我们现在在DST中。这可能是一个小错误,但我希望你们能帮助我。JavaScript时间

P.S.我在这里提问是新的,所以我不知道这个meta。对不起。

预先感谢您。

编辑:我改变了代码,以这样的:`

var today = new Date(); 
Date.prototype.stdTimezoneOffset = function() { 
    var jan = new Date(this.getFullYear(), 0, 1); 
    var jul = new Date(this.getFullYear(), 6, 1); 
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 
} 

Date.prototype.dst = function() { 
    return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
} 
jQuery(function() { 
     if(today.dst()) { 
      jQuery('.server-time').countdown({ 
       since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), 
       compact: true, 
       format: 'HMS', 
       timezone: -4 
       }); 
     }else{ 
      jQuery('.server-time').countdown({ 
       since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), 
       compact: true, 
       format: 'HMS', 
       timezone: -5 
      }); 
     } 
}); 
` 

当我在控制台中进行测试,today.dst()返回true,但时区不因某些原因而改变。

EDIT2: 出于某种原因today.dst()是真实的,但代码放在了别人。

回答

0

不是专家,我不知道你正在尝试在这行

jQuery('.server-time').countdown({since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), compact: true, format: 'HMS', timezone: -4}); 

做,但你可以试试这个:

var today = new Date(); 
Date.prototype.stdTimezoneOffset = function() { 
    var jan = new Date(this.getFullYear(), 0, 1); 
    var jul = new Date(this.getFullYear(), 6, 1); 
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 
} 

Date.prototype.dst = function() { 
    return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
} 
jQuery(function() { 
    var preferences_clock_hide = isPreferenceOn('preferences_clock'); 
    if (!preferences_clock_hide) { 
     if(today.dst()) { 
      jQuery('.server-time').countdown({ 
       since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), 
       compact: true, 
       format: 'HMS', 
       timezone: -4 
       }); 
     } 
    }else{ 
     jQuery('.server-time').countdown({ 
      since: new Date({/literal}{$smarty.now|date_format:"%Y, %m-1, %d"}{literal}), 
      compact: true, 
      format: 'HMS', 
      timezone: -5 
      }); 
    } 
}); 

如果您检查控制台,你会看到这错误:today.dst不是函数

编辑:对不起,对英文我不能解释得很好,只是检查@Undefine回答它解释一切 只是调试y我们的代码使用浏览器工具,你可以看到为什么你没有得到预期的结果。

var jan = new Date(this.getFullYear(), 0, 1); 
var jul = new Date(this.getFullYear(), 6, 1); 
console.log(Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset())); 
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 

,因为你是在返回UTC与本地时间之间的时区差两个功能使用使用getTimezoneOffset都返回相同的值。

return this.getTimezoneOffset() < this.stdTimezoneOffset(); 

这将返回FALSE出于同样的原因,使用getTimezoneOffset在这两个对我用我-60分钟,以结果为-60 < -60,这是假 我希望帮助!

+0

1)谢谢您的回复 2)它没有给我一个错误实际上 3)现在的DST应该是真实的,但它返回出于某种原因 –

0

@Niroda建议严格的代码。问题在于变量的可见性范围。

据我所知,的JavaScript在2迭代阅读代码- 它第一次记住密码(可变只有名称,但包括函数的内容),并扫描错误,第二个 - 它设置的值变量并运行代码。

如果使用默认的功能sintaxis function functionName(...) {...},那么你可以把它放在任何代码的一部分,它会奏效,因为JS想起了一个功能

但是如果你使用的变量选项functionName = function(...) {...}然后JS会记得变量名但它不知道它是一个功能,当运行代码today.dst()在第一次迭代的第二次迭代(运行一切较高此行之后)等于undefined,然后才将其设置为功能。

所以,如果你点击时使用相同的代码,它会好的,但现在你的if语句检查此函数初始化之前的函数结果。

希望你明白了。

+0

谢谢你的答案假的,它真的帮了我一般。但是Niroda的代码由于某种原因不起作用。 –