Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date_Datetime_Save_Dst - Fatal编程技术网

JavaScript:如何设置一个日期,使它在全世界看起来都一样?

JavaScript:如何设置一个日期,使它在全世界看起来都一样?,javascript,date,datetime,save,dst,Javascript,Date,Datetime,Save,Dst,我们的一位程序员决定在MySQL数据库中使用一个日期字段来实现这一点。 发送和保存JS date对象在夏时制更改介入之前效果很好(效果很糟糕:)。 当然,在DATETIME字段中保存日期可以解决这个问题,但是每个人都可以在自己的时区中看到时间/日期。 我们需要每个人(所有时区)都看到同一个日期 我澄清这一点,以获得正确答案: 我想继续在MySQL中使用日期字段存储类型(与DATETIME相比-好吧,可能优化太多了,但它已经存在了,我想从其他开发人员那里得到一个长期的解决方案) 发送本地时间(浏

我们的一位程序员决定在MySQL数据库中使用一个日期字段来实现这一点。 发送和保存JS date对象在夏时制更改介入之前效果很好(效果很糟糕:)。 当然,在DATETIME字段中保存日期可以解决这个问题,但是每个人都可以在自己的时区中看到时间/日期。 我们需要每个人(所有时区)都看到同一个日期


我澄清这一点,以获得正确答案:

我想继续在MySQL中使用日期字段存储类型(与DATETIME相比-好吧,可能优化太多了,但它已经存在了,我想从其他开发人员那里得到一个长期的解决方案)

发送本地时间(浏览器中的本地JS)为2016年5月23日,将以2016年5月22日0X:X0:00Z(UTC)的形式到达服务器,并按此方式存储。因为它是一个日期字段,所以存储值将仅变为2016年5月22日。你失去了一天!:)

贝娄的解决方案不仅修复了日期字段修剪,而且还增加了这样一个事实,即人们现在可以看到相同的正确日期(2016年5月23日),无论他们在哪个时区

我喜欢结果,并希望看到一些更好的解决方案,以实现同样的目标并改进系统

实际上,我们只在夏令时改变时才注意到这个问题,所以我的解决方案(如下面的答案)也是一个很好的解决方案。而且它只消耗客户端的资源

我已经发布了我自己对这个问题的解决方案,作为下面的回答

如果你能提供更好的解决方案,那就太酷了

使用Javascript 以ISO格式保存日期(包括时区信息),并用于将日期时间转换为其他时区

如果
moment.js
还不是依赖项,并且您希望避免额外的库,请继续阅读

使用MySQL 与其在写入数据时解决此问题(在过程中丢失时区信息),不如在读取数据库时解决此问题


选择
查询中,使用内置函数将所有
日期时间
值标准化为您首选的时区。

MomentJs是您的最佳选择。找到你想要的时区,并将ISO字符串传递给它,你就可以开始了。
有更多的解决方案,但我能想到的最快、最简单的解决方案如下:

让我们尽早介入信息流。 在通过AJAX传输数据之前,只需更改数据即可

我们使用的功能是:

    function addTimezoneDiffAnd12HoursToDate(date) { 
            var timezoneOffset = date.getTimezoneOffset();
            date.setHours(12-Math.floor(timezoneOffset/60)); 
            date.setMinutes(-timezoneOffset % 60); 
            return date;
    }
它的作用是将日期转换为始终在UTC的中午(12:00)

您可以这样使用它:

    $scope.contract.contractDate = addTimezoneDiffAnd12HoursToDate($scope.contract.contractDate);
并将其发送到DATE字段中存储


如果您有更简单的解决方案,请告诉我。我想看看。

日期只不过是一年、一个月、一天。它没有时间,也没有时区。想想你的生日、结婚日期,或者今天的日期

JS
Date
对象根本不是这个。这是一个时间戳。它是自UTC 1970年1月1日午夜以来经过的毫秒数

你应该尽可能地把你的约会作为一个约会。使用ISO-8601仅日期格式,即
YYYY-MM-DD
。如果你必须给它指定一个时间和时区,那么在指定时要非常小心

如果你只是指定了当地的午夜时间,那么你就有失去一天的风险(正如你所展示的),而且你没有考虑到在某些时区中有一些当地的日子是不存在午夜的!(比如巴西的春运日)。中午比午夜更安全,但你还是应该谨慎使用。更好的方法是将日期保留为日期,而不是日期时间


另外,如果可以的话,我会用代码来回答,但是你没有在问题中提供任何代码来显示什么是坏的。请阅读和阅读。谢谢。

convert\t对我来说是新闻,谢谢!但是,选择CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');无法在不使系统复杂化的情况下获取动态参数(例如,必须传递数据)。请看我最新的问题。我已经补充了一些澄清。我明白你的意思了。tz(“2014年5月12日晚上8点”,“嗯,我做YYYY哈”,“美国/多伦多”);它可以工作,但会占用更多的资源(参数和库本身)。我们没有足够的与这些数据类型的交互来证明包含它是合理的。顺便说一句,我喜欢moment.js。请看我更新的问题。我已经补充了一些澄清谢谢,这就是我所做的,谢谢你的确认。请在我的回答中查看AddTimeZoneDiffand 12hoursToDate的代码。我在解决方案中所做的是始终在UTC中午(12:00)发送日期!