Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript处理时区的最佳方法是什么_Javascript_Time_Timezone - Fatal编程技术网

使用Javascript处理时区的最佳方法是什么

使用Javascript处理时区的最佳方法是什么,javascript,time,timezone,Javascript,Time,Timezone,我有一个具有给定时区的经过身份验证的用户,例如“Berlin,GMT+1”。为了回答这个问题,假设我在全球范围内: var timeZone = "Berlin"; var gmtDistance = 1; 最好的解决方案是让所有与日期相关的JS都相应地工作,这意味着如果我创建一个新的日期对象,它将考虑时区 我认为这很简单,但我似乎没有找到在Google/SO上实现这一点的完美方法。我希望得到一个不需要任何外部库的答案。这样的答案怎么样 我的首选方法是使用UTC时间在服务器端存储所有日期,

我有一个具有给定时区的经过身份验证的用户,例如“Berlin,GMT+1”。为了回答这个问题,假设我在全球范围内:

var timeZone = "Berlin";
var gmtDistance = 1;
最好的解决方案是让所有与日期相关的JS都相应地工作,这意味着如果我创建一个新的日期对象,它将考虑时区



我认为这很简单,但我似乎没有找到在Google/SO上实现这一点的完美方法。我希望得到一个不需要任何外部库的答案。

这样的答案怎么样


我的首选方法是使用UTC时间在服务器端存储所有日期,当我处理通过AJAX调用返回的数据时,创建一个全局处理程序来进行一些解析

以下示例允许您简单地使用:

app.ajax({
    url: '/My/Post/Url',
    data: {
        MyProperty: 'MyValue'
    },
    success: function (data, status, xhr) {
        // Do stuff here...
    },
    error: function (xhr, settings, error) {
        // Do stuff here...
    }
});
但是,它通过将UTC时间的日期固定到本地时区来预解析“success”函数的“data”元素中的任何返回值。请注意-执行此操作后,如果您进一步处理数据,则需要在将其发送回服务器之前取消修复,否则您将使用偏移量将其发回

var app = window.app = $.extend(true, {}, app, {
    // Creating a namespace for my app which is safe across multiple files.
    ajax: function (options) {
        var defaultSettings = {
            type: 'POST',
            async: true
        };

        // Capture the settings.
        var settings = $.extend(true, {}, defaultSettings, options);

        // Install our general handlers;
        if (settings.success) {
            settings.success = function (data, textStatus, jqXHR) {
                app.OnPostSuccess(data, textStatus, jqXHR, options.success);
            }
        } else 
            settings.success = app.OnPostSuccess;

        if (settings.error) {
            settings.error = function (jqXHR, ajaxSettings, thrownError) {
                app.OnPostError(event, jqXHR, ajaxSettings, thrownError, options.error);
            }
        } else
            settings.error = app.OnPostError;

        $.ajax(settings);
    },
    OnPostSuccess: function (data, textStatus, jqXHR, fn_after) {
        // Do my generalized success handling here.

        // Fix Dates.
        var fixedData = app.FixDate(data);

        // Call any other handler that's been specified.
        if (typeof fn_after === 'function')
            fn_after(fixedData, textStatus, jqXHR);
    },
    OnPostError: function (jqXHR, ajaxSettings, thrownError, fn_after) {
        // Do my generalized error handling here.

        // Call any other handler that's been specified.
        if (typeof fn_after === 'function')
            fn_after(jqXHR, ajaxSettings, thrownError);
    },
    FixDate: function (obj) {
        var fixed = obj;

        if (typeof obj == 'string' && obj.indexOf('\/Date(') == 0) {
            // Microsoft date "/Date(12345678)/" - convert to real date.
            fixed = new Date(parseInt(fixed.substr(6, fixed.length - 8), 10));
        }

        if (typeof fixed === 'object') {
            if (fixed.getTimezoneOffset) {
                // If the value is a date, apply timezone correction.
                var now = new Date();
                var offset = now.getTimezoneOffset(); // # of minutes from GMT.
                fixed = new Date(fixed.getTime() + offset * 60000);
                // This updates the value based on the offset.
            } else {
                // Otherwise, update each of its properties.
                // This fixes objects with dates for properties, recursively.
                $.each(fixed, function (index, value) {
                    fixed[index] = app.FixDate(value);
                });
            }
        }

        return fixed;
    }
});
所有这些都是为了达到这个目的。如果您现在在OnPostSuccess中处理日期之类的事情,那么您可以确保它们始终采用正确的格式,并且始终位于正确的时区

无论您是否使用上述AJAX方法,您都可以使用FixDate方法,如下所示:

var MyObj = { 
    MyDate: "\/Date(12345678)\/"
};

console.log('Before: ', MyObj.MyDate);
MyObj = app.FixDate(MyObj);
console.log('After: ', MyObj.MyDate);
要查看实际的示例,请查看以下JSFIDLE:


注意:这还包括AJAX位——但在示例中没有使用它们——只是为了完整性。

也许dojo toolkit可以为您提供一些想法[因为您不需要外部库;)]

DojoToolkit附带了一个很好的日期/时间处理类,并提供了完全的本地化支持,甚至还提供了时区支持。

谢谢你的回答,但这似乎不是最理想的,这篇文章的作者建议改为使用
var MyObj = { 
    MyDate: "\/Date(12345678)\/"
};

console.log('Before: ', MyObj.MyDate);
MyObj = app.FixDate(MyObj);
console.log('After: ', MyObj.MyDate);