Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 获取客户端';ExpressJS中的s时区偏移_Javascript_Node.js_Express_Timezone - Fatal编程技术网

Javascript 获取客户端';ExpressJS中的s时区偏移

Javascript 获取客户端';ExpressJS中的s时区偏移,javascript,node.js,express,timezone,Javascript,Node.js,Express,Timezone,我正在寻找一种在ExpressJS中获取客户端时区偏移量的方法(例如,使用req对象将非常好)。有些人喜欢使用该库处理任何与时间有关的事情,但我相信Javascript中的对象满足您的需要,并且不需要库。这就是你需要的。我希望这有帮助!如果您还有其他问题,请告诉我 如果您控制客户端,您可以 如果您不这样做(例如,您正在构建一个类似API的服务器端组件),那么您就无法将其从HTTP请求中拉出(除非您正在使用会话,但即使这样也不一定可靠) 好的方面是,如果只是服务器端,您也不必担心:将所有日期对象设

我正在寻找一种在ExpressJS中获取客户端时区偏移量的方法(例如,使用req对象将非常好)。

有些人喜欢使用该库处理任何与时间有关的事情,但我相信Javascript中的对象满足您的需要,并且不需要库。这就是你需要的。我希望这有帮助!如果您还有其他问题,请告诉我

如果您控制客户端,您可以

如果您不这样做(例如,您正在构建一个类似API的服务器端组件),那么您就无法将其从HTTP请求中拉出(除非您正在使用会话,但即使这样也不一定可靠)


好的方面是,如果只是服务器端,您也不必担心:将所有日期对象设置为UTC或Unix时间戳,并将其留给客户端开发人员来处理时区。

事实是,即使您已经获得了时区偏移量,但考虑到某些方面,这并不意味着您在客户端拥有正确的时间“夏令时”

但是,考虑到以下数据,您可以“猜测”用户所在的时区:

  • req.get('Accept-Language'),用户现在可能居住的国家/地区
  • req.ip,在数据库中搜索并找出大致位置
  • 客户端(新日期).getTimezoneOffset(),用于时区偏移
  • 最后,通过对上述结果的计算,您的猜测应该是差不多的。时区应该存储在类似“America/New_York”的字符串中,而不是时区偏移量

    应该是处理时区的好工具


    保存“几乎正确”的时区后,不要忘记留下一个用户可以更改它的地方。

    正如其他人提到的,通过HTTP获取客户端浏览器/OS时区偏移量是不可用的,因此您需要从客户端发送此数据

    在我的例子中,我有一个需要登录的应用程序……因此我可以存储用户的首选项。默认情况下使用浏览器时区,但用户也可以配置一个特定的时区,以便随时使用,该时区存储在他们的用户配置文件中(例如
    美国/达拉斯
    欧洲/阿姆斯特丹

    我不相信浏览器时间是正确的。用户可能也搞错了他们的操作系统时区设置…因此时区偏移也可能不正确。然而,大多数现代操作系统会根据地理IP隐含位置自动设置时区…因此,对于许多用户来说,能够周游世界、登录应用程序并查看日期非常方便/无论他们在哪个本地时区,都值得为用户体验付出努力。总是希望看到特定时区的用户可以配置该时区,我们将使用该首选项

    我这样做的方式如下……在登录表单上添加一个隐藏字段,并使用javascript设置值。当用户登录时,将此时区偏移存储在会话中。如果用户没有设置首选时区,则在呈现日期/时间时,我们使用此偏移。这意味着如果您有长会话,并且用户可以在b在不同的国家/地区之间…在下次注销/登录之前,它们仍然会显示旧的时区偏移量。当然,如果您愿意,您可以更频繁地获取此数据,甚至在每次请求时获取此数据…但就我而言,在登录时获取此数据就足够了。我的会话在IP地址更改时过期…所以是的。当然,如果他们的会话跨越daylight savi然后,直到下一次登录(假设他们的操作系统/浏览器TZ首先是正确的),偏移量才会准确

    客户端
    
    var tzOffset=新日期().getTimezoneOffset(),
    tzInput=document.getElementById('tzOffset');
    tzInput.value=tzOffset*(-1);
    
    请注意,我将它乘以
    -1
    ,因为我将在express端使用矩.js进行格式化,并且偏移量是向后的(utc本地偏移量与utc本地偏移量)。您也可以在服务器端执行此操作。在使用此数字之前,您可能也应该验证此数字……这里只提供最简单的示例代码

    服务器端 然后在服务器端(express),如果成功登录,我会将tzOffset值粘贴到会话中

    然后,当使用
    时刻时区设置express中的日期格式时,我可以执行以下操作。此函数是一个“格式化程序”,我可以将其公开给pug/视图,然后使用正确的时区/格式为用户格式化任意随机日期对象

    函数formatDateTimeForUser(日期){
    var userTZ,//用户指定的TZ,如Europe/Berlin
    userTZoffset,//tzOffset我们从登录表单获得
    userDateFormat,//用户指定的日期格式(或默认值)
    userTimeFormat;//用户指定的时间格式(或默认值)
    if(userTZ)
    返回时刻(date).tz(userTZ).format(userDateFormat+''+userTimeFormat+'zz');
    其他的
    返回时刻(日期).utcOffset(userTZoffset).format(userDateFormat+''+userTimeFormat+'ZZ');
    }
    
    ZZ
    格式用于以数字偏移格式显示时区(当我们使用来自客户端的固定数字偏移时相关)

    zz
    格式用于以字符格式(如PDT、PST、EST等)显示时区,当我们有一个像欧洲/柏林这样的时区而不是一个固定的数字偏移时,该格式是相关的

    另一种方法 将原始日期推送到客户端并进行客户端格式化。缺点是较少的控制和一致性,更多的js推送到浏览器。如果您愿意,moment也将在客户端运行

    我只是根据用户区域设置和用户pref在服务器端配置格式化程序,然后在express中公开这些格式化程序,以便在我的pug模板中使用

    滑稽故事 我的一位同事在他们的电脑上手动设置了错误的时区,因此时间是错误的。他们没有固定时区,而是禁用了网络时间,并手动将时间设置为“正确”