在C中,是否有一种简单的跨平台方法来检索给定时区开始和结束夏令时的日期?
我已经有时区偏移信息以及当前是否正在观察夏令时,但我确实需要夏令时开始和结束的日期(对于我无法控制的外部依赖).在Windows中,我使用GetTimeZoneInformation来获取TimeZoneInfo,但我找不到类似的Linux/Solaris/Mac功能.我还应该指出,我不能仅仅依靠美国的夏令时采用规则,因为我无法预测它将被用于的国家.
我知道获取此信息的唯一方法是通过zdump或者直接查看/ usr/share/lib/zoneinfo文件本身,但我希望有更好的解决方案.
感谢您的任何帮助,您可以提供.
我有一个基于时间的rails查询,它有一些奇怪的时区敏感行为,即使据我所知我使用的是UTC.简而言之,这些查询给出了不同的答案:
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours).gmtime]).length
=> 279
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours)]).length
=> 280
Run Code Online (Sandbox Code Playgroud)
DB实际上确实包含在过去一小时内创建的一个模型,并且模型的总数为280.因此只有第一个查询是正确的.
但是,在environment.rb中我有:
config.time_zone = 'UTC'
Run Code Online (Sandbox Code Playgroud)
系统时区(由'日期'报告)是BST(GMT + 1) - 因此不知何故,这会被视为UTC并打破查询.
这引起了我各种各样的问题,因为我需要将在不同时间传递的查询参数化为一个动作(然后使用Time.parse()进行转换),即使我以UTC时间发送,这个'关闭一小时'DST问题很多.即使使用'.gmtime()'也似乎无法解决它.
显然,这种差异是由某个地方的隐式转换造成的,导致BST被错误地视为UTC,但为什么呢?rails是否以UTC格式存储时间戳?Time class timezone不是很清楚吗?我正在使用Rails 2.2.2
那么这里发生了什么 - 围绕它编程的安全方法是什么?
编辑,一些额外的信息来显示DB和Time类正在做什么:
>> Model.find(:last).created_at
=> Tue, 11 Aug 2009 20:31:07 UTC +00:00
>> Time.now
=> Tue Aug 11 22:00:18 +0100 2009
>> Time.now.gmtime
=> Tue Aug 11 21:00:22 UTC 2009
Run Code Online (Sandbox Code Playgroud) 我在时区有点迷失了:)
我有以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的国家.
有一个示例代码
<?php
$dt = new \DateTime();
$dt->setTimezone(new \DateTimeZone('Europe/London'));
$timestamp = 1351383400;
echo "$timestamp \n";
$dt->setTimestamp($timestamp);
echo $dt->getTimestamp();
Run Code Online (Sandbox Code Playgroud)
输出2个不同的时间戳1351383400(太阳,2012年10月28日01:16:40 + 0100,DST开关前)和1351387000(太阳,2012年10月28日01:16:40 +0000,1小时后,DST开关后)
问题是如何让Timestamp getter返回我之前传递给Timestamp setter 1行的完全相同的整数?
PHP 5.3.6
System.TimeZoneInfo有一个名为IsDaylightSavingTime的方法,该方法接受DateTime对象,如果指定的日期时间落在该时区的DST中,则返回true.在NodaTime中是否有相同的功能或其他方式来实现相同的结果?
在Joda Time中,人们可以轻松地使用该DateTimeZone.isLocalDateTimeGap方法来判断本地日期和时间是否无效,因为它属于由春季前进夏令时转换创建的间隙.
DateTimeZone zone = DateTimeZone.forID("America/New_York");
LocalDateTime ldt = new LocalDateTime(2013, 3, 10, 2, 0);
boolean inGap = zone.isLocalDateTimeGap(ldt); // true
Run Code Online (Sandbox Code Playgroud)
但是你如何发现后退过渡?换句话说,如果由于存在重叠而导致本地日期和时间不明确,您如何检测到?我会期待类似的东西zone.isLocalDateTimeOverlap,但它不存在.如果是的话,我会像这样使用它:
DateTimeZone zone = DateTimeZone.forID("America/New_York");
LocalDateTime ldt = new LocalDateTime(2013, 11, 3, 1, 0);
boolean overlaps = zone.isLocalDateTimeOverlap(ldt); // true
Run Code Online (Sandbox Code Playgroud)
Joda-Time文档清楚地表明,如果在转换期间存在重叠,除非另有说明,否则将采用更早的可能性.但它没有说明如何检测这种行为.
我可以让Rails在几秒钟内对我的计算应用相同的逻辑,就像我多年来的计算一样吗?
puts "#{1.year.from_now} | #{1.year.to_i.seconds.from_now}"
2017-03-23 18:48:06 UTC | 2017-03-24 00:48:06 UTC
Run Code Online (Sandbox Code Playgroud)
我不明白6小时差异来自哪里.
如果它目前在太平洋时区的DST,我需要将时间抵消一个小时.无论用户的当地时区如何,我如何确定太平洋时区的当前夏令时状态?
这是我到目前为止所拥有的.第4行中的"dst"只是一个函数的占位符,它可以告诉我该区域的夏令时是否有效.
function checkTime() {
var d = new Date();
var hour = d.getUTCHours();
var offset = dst ? 7 : 8; // is pacific time currently in daylight savings?
// is it currently 6 AM, 2 PM, or 10 PM?
if (hour === ((6 + offset) % 24) || hour === ((14 + offset) % 24) || hour === ((22 + offset) % 24)) {
// do stuff
}
}
checkTime();
Run Code Online (Sandbox Code Playgroud) 特定银行在世界所有主要城市都设有分支机构.它们都在当地时间上午10点开放.如果在使用DST的时区内,那么当地的开放时间也遵循DST调整的时间.那么我如何从当地时间到最佳时间.
我需要的是这样的功能to_utc(localdt, tz):
参数:
返回:
编辑:
最大的挑战是检测本地时间是否处于DST期间,这也意味着它是DST调整的.
对于夏季+1 DST的'Europe/Berlin':
对于没有DST的'Africa/Lagos':
java.time.zone.ZoneRules#nextTransition不会返回Europe / Moscow 1991的DST更改,因此我无法获得Europe / Moscow 1991的DST边界。Europe / Moscow 在1991-03-31 02:00进入了夏令时,但也更改了其标准偏移量,因此偏移量(+03:00)保持不变,而没有Java API可用于获得DST开始的边界。
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.zone.ZoneOffsetTransition;
public class TimeUtilTest {
public static void main(String[] args) {
ZoneId tz = ZoneId.of("Europe/Moscow");
ZonedDateTime yearBegin = ZonedDateTime.of(1991, 1, 1, 0, 0, 0, 0, tz);
ZoneOffsetTransition nextTransition = tz.getRules().nextTransition(yearBegin.toInstant());
System.out.println("year begin isDST=" + tz.getRules().isDaylightSavings(yearBegin.toInstant()));
System.out.println("next transition before is " + nextTransition.getDateTimeBefore() + " isDST=" + tz.getRules()
.isDaylightSavings(nextTransition.getInstant().minusNanos(1)));
System.out.println("next transition after is " + nextTransition.getDateTimeAfter() + " isDST=" + tz.getRules() …Run Code Online (Sandbox Code Playgroud)