DateTime :: Diff应计算适当的间隔并考虑夏令时(DST)和闰年.虽然显然不是这样.恐怖代码:
$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));
echo $d1->getOffset() / (60 * 60);
Run Code Online (Sandbox Code Playgroud)
打印'2'!请记住前一天的UTC时间= 1h - 2h = 23:05:00.
echo $d2->getOffset() / (60 * 60);
Run Code Online (Sandbox Code Playgroud)
打印'1'.DST发生了.UTC时间= 3h - 1h = 02:05:00
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Run Code Online (Sandbox Code Playgroud)
打印'2'!错误?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60;
echo "Calculated difference in hours: $hoursofdiff";
Run Code Online (Sandbox Code Playgroud)
打印'3'!正确?
当时钟在给定日期时间03:00:00时,所有瑞典人将他们的时钟倒退一小时至02:00:00.这意味着在01:05到03:05之间传递的总量是三个小时,非常类似于使用UNIX TimeStamp时的手动计算回显.就像我们用手指计算我们是否使用模拟时钟一样.当我们使用PHP自己的偏移逻辑(!)计算两个UTC时间戳之间的差异时更是如此.
它是PHP还是我的大脑停止正常工作?来自你们任何人的谴责所有存在于这个网站上的众神会让我如此开心!
我在Apache服务器上使用PHP 5.4(VC9).不幸的是我使用Windows 7 x64作为操作系统.我已经针对PHP日期/时间类中的所有错误声明测试了我的设置(有一些与Windows相关),并且可以确认我的系统没有.除了上述代码,我没有发现任何其他错误.我几乎验证了所有代码并输出了"PHP Architect的日期和时间编程指南"这本书.因此,我必须得出结论,它必须是我的大脑女巫违约,但我想我先在这里拍摄.
TimeZoneInfo和Olson数据库是否对时区使用相同的标识符?
我从GeoNames服务(基于Olson数据库)获得时区ID,并希望检索该时区的日光保存信息.
datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
此调用返回的日期时间不正确,从UTC/GMT延迟1小时(请登录:http://www.worldtimeserver.com/current_time_in_UTC.asp).
它应该像它应该的那样工作吗?
例如,它现在正在返回:
2015-02-17 23:58:44.761000.
Run Code Online (Sandbox Code Playgroud)
当前UTC时间是:00:58,而不是23:58
我在服务器和客户端之间转换日期时遇到了问题,两者都在德国运行.客户端计算机上的区域设置可以设置为英国或德国.我从服务器接收CET格式的日期,我需要在UI上将此时间表示为英国时间.例如,从服务器收到的时间,例如01/07/2010 01:00:00应该在UI上表示为01/07/2010 00:00:00.我已经为此目的编写了一个转换器,但是在运行它时会产生2小时的时差.下面是代码,请帮忙吗?
public class LocalToGmtConverter : IDateConverter
{
private readonly TimeZoneInfo timeZoneInfo;
public LocalToGmtConverter()
: this(TimeZoneInfo.Local)
{
}
public LocalToGmtConverter(TimeZoneInfo timeZoneInfo)
{
this.timeZoneInfo = timeZoneInfo;
}
public DateTime Convert(DateTime localDate)
{
var utcKind = DateTime.SpecifyKind(localDate, DateTimeKind.Utc);
return utcKind;
}
public DateTime ConvertBack(object fromServer)
{
DateTime serverDate = (DateTime)fromServer;
var utcOffset = timeZoneInfo.GetUtcOffset(serverDate);
var uiTime = serverDate- utcOffset;
return uiTime;
}
}
Run Code Online (Sandbox Code Playgroud) 在我们的网络应用程序中,我们需要显示和输入不同时区的不同国家/地区的日期时间信息.现在,我们正在为每个国家/地区维护单独的Web服务器和单独的数据库(oracle 11g).
我们计划将所有门户网站合并为一个数据库(oracle 11g).此门户应捕获/显示用户本地时区的日期和时间.
到目前为止,我已经搜索了这个,我得到了以下建议.
1)将Web服务器和数据库服务器的时区设置为UTC,同时将获取数据(数据和时间)转换为用户本地时区.
如果您建议采用这种方法,请澄清以下具体问题.
大多数时候我们只捕捉日期,是否需要始终捕捉日期和时间以及时区?
在javascript/java/oracle中存储我们需要将用户本地时区转换为UTC的日期和时间?
在获取我们需要将UTC转换为用户
本地时区查询本身/ java/java脚本的日期和时间时?
很多地方我们有报告显示基于日期列,如
今天/当前月/日期范围.我们可以处理这个(输入 - 用户本地时区 - 数据库在UTC)?
2)以用户本地时区和UTC捕获日期和时间.存储为单独的列,用户本地时区将用于显示目的,UTC将用于业务逻辑.
如果您建议采用这种方法,请澄清以下具体问题.
存储用户本地时区和UTC是否常见?
哪个列我必须检查条件,同时根据日期列显示报告,如今天/当前月/日期范围?
我们必须将哪种数据类型用于日期列
(日期/时间戳/时间戳与时区/时间戳与本地时
区)?
提前致谢
我在时区有点迷失了:)
我有以UTC时间存储的数据.服务器在荷兰,所以我们住在utc + 1(现在,在daylightavingtime,utc + 2)
现在客户说:从8月5日开始给我数据.
所以我必须从'他的时间'计算出来的时间.为此,我必须知道:
什么是你的utc偏移(我们存储在他的个人资料中,让我们说utc -6)你是在白天时间(因为那时我们必须添加+1并使utc偏移-5)
然后我的问题:
我可以问.Net框架:国家XX是否有白天时间?
我可以问.Net框架:在那个时刻的国家XXX daylightavingtime是08-05-2010T00:00:00吗?
我一直在尝试.ToLocalTime(),但是这只给了我服务器的本地时间,这不是我想要的,我想用用户的时区计算,还有在那个特定的事实时间点,如果他/她处于白天
我也看过这个VB例子:
TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")
Dim Dated As DateTime = TimeZoneInfo.ConvertTimeToUtc(TempDate, TimeZone)
Run Code Online (Sandbox Code Playgroud)
但是imho没有考虑到这个时区的用户是否处于daylightavingtime(dst)国家/地区.例如,这个时区的一个用户在荷兰有dst,另一个用户在另一个没有dst的国家.
在我的申请中,我试图计算格林尼治标准时间(英国时间)午夜时间.目前我正在这样做:
$now = new DateTime();
$timeToMidnight = $now->setTimezone(new DateTimeZone('Europe/London'))->diff(new DateTime('tomorrow'))->format('%h hours, %i minutes and %s seconds');
Run Code Online (Sandbox Code Playgroud)
代码正在运行,但似乎落后一小时(使用GMT -1).目前时间是晚上11:49,输出是这样的:
1 hours, 10 minutes and 36 seconds
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查了我php.ini,我也将时区设置为GMT:
date.timezone = Europe/London
Run Code Online (Sandbox Code Playgroud)
检查也证实了这一点phpinfo().
是什么赋予了?为什么我的应用程序没有使用正确的时区?
我有一个关于处理夏令时的一般问题.我猜它不是特定于PHP的,但我用PHP编写,所以我认为包含它不会有什么坏处.
我有一个使用jquery fullcalendar构建的日历应用程序.用户在本地时区查看事件,我的服务器将它们存储为mysql中的UTC日期时间.(有关stackoverflow的其他问题表明这是处理时区的最佳方法.)因此,每次用户在日历上保存或查看事件时都会进行转换.这工作正常,但我很困惑如何最好地处理夏令时.
例如,假设时区EST(东部标准时间)的用户创建一个事件,当它不是夏令时,每天下午3点重复.我的PHP代码使用标准的DateTime(和DateTimeZone)类在UTC和EST之间转换UTC-5:00.当夏令时处于活动状态时,时钟将提前一小时,PHP将在UTC和EST之间转换UTC-4:00.从用户的角度来看,事件从原来的下午3点转移到下午4点.这不是我的用户和我想要的.无论夏令时如何,下午3点的活动都应该在下午3点举行.处理这个问题的最佳方法是什么?PHP中有没有办法忽略夏令时?
我的代码:
$getDate = new DateTime($storedDate, new DateTimeZone('UTC'));
$getDate->setTimezone(new DateTimeZone('America/New_York'));
$getDateString = $getDate->format('Y-m-d H:i:s');
Run Code Online (Sandbox Code Playgroud)
更多信息:(从我下面的评论中复制)
- 仅存储重复事件的第一次出现.根据用户请求的日历视图(月,周或日视图)动态创建所有其他事件.通过我编码的方式,它只创建在视图上可见的事件.
- 问题是,我还需要为其他时区保持不变.继续原始示例,下午3点应该在美国东部时间下午3点(不管夏令时),但如果在中部时间观看事件,该事件也应该在下午2点(不管夏令时).
从本质上讲,我需要以某种方式忽略夏令时.
我正在为我们的应用设定标准.
我一直在想,我应该选择使用什么默认日期格式?
它应该是:
谢谢你,
马克西姆.
我正在阅读很多关于时区,偏移,utc,当地时间,javascript函数,DST,培根的内容,而我正试图将这些内容整合在一起,为我的应用程序构建一个可靠/正确的结构.
假设我的应用程序类似于StackOverflow.
这就是我在做的......
DateTimeOffset.TimeZoneID.2012-07-19T14:30:00-03:00.我有几个问题......
关于我的服务器(单个服务器)......它应该以"中性"UTC(+00:00)运行吗?如果将来我们迁移到服务器在不同位置运行的服务器场,该怎么办?
目前,我正在将日期存储为DateTimeOffset.我正在阅读关于保存的内容,TimeZoneID但我认为没有任何用处.我错过了什么吗?
或者我应该像DateTimeUtca 一样存储日期TimeZoneID并手动转换每个日期与TimeZone班级?
在客户端上转换数据是否安全?或者日期转换应该始终在服务器端?
使用我目前的方法.DST会受到尊重吗?