JavaScript time

JavaScript time

本文关键字:time JavaScript      更新时间:2023-09-26
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。这可能是一个小错误,但我希望你们能帮助我。

附言我是在这里提问的新手,所以我不知道元。对不起。

提前谢谢你。

编辑:我将代码更改为:'

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,但由于某种原因时区没有改变。

编辑2:出于某种原因,今天 .dst() 是正确的,但代码在 else 中。

@Niroda建议使用严谨的代码。问题出在变量的可见性范围内。

据我所知,JavaScript在 2 次迭代中读取代码 - 第一次它记住代码(仅适用于变量名称,但包括函数内容)并扫描错误,第二次 - 它设置变量的值并运行代码。

如果您使用默认函数 sintaxis function functionName(...) {...}那么您可以将其放在代码的任何部分,它将起作用,因为 JS 记住了一个函数

但是如果你使用变量选项functionName = function(...) {...}那么 JS 会记住变量名,但它不知道它是一个函数,并且在运行代码时today.dst()第一次迭代时等于 undefined,只有在第二次迭代时(在运行所有内容后,这一行更高)它会将其设置为函数。

因此,如果您在单击时使用相同的代码,则可以,但是现在您的语句if在初始化此函数之前检查函数结果。

希望你明白了。

不是专家,我不知道你在这一行想做什么

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答案它解释了一切只需使用浏览器工具调试代码,您就可以看到为什么没有得到预期的结果。

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

两者都将返回相同的值,因为您在两个函数中使用 getTimezoneOffset 返回 UTC 和本地时间之间的时区差异。

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

出于同样的原因,这将返回 FALSE,两者都使用了 getTimezoneOffset 对我来说,我有 -60 分钟,所以结果是 -60 <-60,这是假的我希望这有所帮助!