不,我不是在谈论区域偏移 - 这些区域在一年中可能因基于例如夏令时的区域而变化.我在谈论IANA维护的实际时区.我理解ISO 8601 不支持这些,对吗?
什么平台在支持ISO 8601类似字符串表示中识别时区?我注意到最新的Java日期/时间库正在使用扩展的ISO 8601格式,例如2011-12-03T10:15:30+01:00[Europe/Paris].(请参阅DateTimeFormatter API.)
是否有一些融合约定(例如与其他语言和平台一起)用于扩展ISO 8601以支持时区指定?
我试图在我的Spring/Hibernate应用程序中使用HQL查询所有客户记录,其中Date1和Date2之间的DateAdded或Date1和Date2之间的LastSeen,所以我在Repository/DAO类中构建了这个HQL查询:
sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN '"+startDate+"' AND '"+endDate+"'").list();
Run Code Online (Sandbox Code Playgroud)
我调试了应用程序来检查startDate和endDate,发现它们被发送为:
startDate:Wed 1月22日01:16:57 HKT 2014
endDate:Wed Jan 29 01:16:57 HKT 2014
在DB中,我100%确定至少有一条记录符合此查询,因为此记录DateAdded和LastSeen如下:
2014-01-23 15:33:38
2014-01-25 15:33:38
那么有人可以告诉我我在做错了什么/在这里失踪了吗?
我有一个数据库,其时间为UTC.这个时间可以在网页上显示,因此我被要求在页面中显示为本地时间,因为它可以从任何国家/地区查看.一位同事提到了从当前线程(在服务器上)获取国家/地区设置的一些内容,但我找不到任何有关此问题的详细信息.我想做什么?
我需要将DateTime + TimeZoneInfo转换为DateTimeOffset.
我该怎么做呢?我假设我必须通过TimeSpan,但后来我不确定夏令时是否会得到妥善处理..
谢谢!
UPDATE
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
return new DateTimeOffset(DateTime.UtcNow, timeZone.BaseUtcOffset);
Run Code Online (Sandbox Code Playgroud)
此代码抛出异常..
Utc DateTime实例的UTC偏移量必须为0.\r \nParameter name:offset
更新2
对不起,我没有意识到DateTimeOffset只包含偏移量,它不包含实际的区域信息 - 所以我接受@Dave的回答,因为它是我将要使用的..
我正在使用TimeZoneInfo在客户端wallclock'Eastern Time'和UTC之间进行转换.我的问题是在秋季DST更改期间发生的"重复"小时.
从UTC到Eastern的转换期间:
2010-11-07 06:00 UTC - >给出2010-11-07T 01:00:00-03:30
2010-11-07 07:00 UTC - >给出2010-11 -07T 01:00:00-03:30
我怎么知道哪个是第一个小时,哪个是第二个小时?DateTime.IsDaylightSavingTime()在两个小时都返回false,但是它不应该在第一个小时返回true吗?
同样,我如何存储2010-11-07 01:00:00 -03:30?如何将我的应用程序转换为UTC,因为它可能是2010-11-07 06:00或2010-11-07 07:00
对于那些需要代码的人,我骑自行车穿过一个带有UTC日期时间列的数据表,尝试使用'DupHr'列转换为东部第二个重复小时,但我总是在01:00时结束'DupHr'= 1.
TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime EasternTime;
DateTime DuplicateHour = new DateTime(2010, 11, 7, 1, 0, 0); // hard coded for this example
TimeZoneInfo.AdjustmentRule[] rules = est.GetAdjustmentRules();
foreach (DataRow row in dt.Rows)
{
row["DupHr"] = 0; // by default not duplicate hour
EasternTime = TimeZoneInfo.ConvertTimeFromUtc((DateTime)row[UTCColumnName], est);
if (!EasternTime.IsDaylightSavingTime())
{
if …Run Code Online (Sandbox Code Playgroud) 我可以在Java中使用哪种数据类型来保存当前日期和时间?我想将日期时间存储在数据库中,并在java bean中有一个字段来保存它.
是java.util.Date吗?
我知道,有些误导性的标题.从来没有真正想要存储TimeZoneInfo对象本身:相反,我想存储一些文化中立的标识符,然后可以在以后用于重建一个实例TimeZoneInfo.
目前,我正在存储TimeZoneInfo.Id属性的价值,在英语和俄语版本的Windows上似乎都可以,但我只是想确保我做正确的事情.
通常,处理日期时的最佳做法是将它们存储在UTC中并转换回用户在应用程序层中所期望的任何内容.
这不一定适用于将来的日期,特别是在日期/时间特定于用户时区的情况下.基于当地时间的时间表需要存储当地时间.
在我的情况下,有一个属性,它是一个包含未来事件的START_TIME时间戳,相比于其他一切现在或过去(包括created_at和updated_at时间戳).
该特定字段是用户选择时间的未来事件的时间戳.
对于未来的事件,似乎最好的做法是不存储UTC.
开发人员可以保存用户期望我们保存的内容:停机时间,而不是将时间与时区一起保存.
当用户选择上午10点时,即使由于夏令时用户与UTC的偏移在创建和事件日期之间发生变化,它也需要保持上午10点.
因此,在2016年6月,如果用户在悉尼午夜2017年1月1日创建活动,则该时间戳将作为数据库存储在数据库中2017-01-01 00:00.创建时的偏移量为+10:00,但在事件发生时,它是+11:00 ..除非政府决定在此期间改变它.
同样明智的,我希望我在2016年1月1日午夜在布里斯班创建一个单独的活动,也可以存储为2017-01-01 00:00.我存储时区,即存储Australia/Brisbane在单独的字段中.
我尝试了很多选择但没有成功:
问题,这只会在读取时跳过转换,而不是写入.
self.skip_time_zone_conversion_for_attributes = [:start_time]
Run Code Online (Sandbox Code Playgroud)
config.default_timestamp :local为此,我设置:
配置/ application.rb中
config.active_record.default_timezone = :local
config.time_zone = 'UTC'
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ event.rb
...
self.skip_time_zone_conversion_for_attributes = [:start_time]
before_save :set_timezone_to_location
after_save :set_timezone_to_default
def set_timezone_to_location
Time.zone = location.timezone
end
def set_timezone_to_default
Time.zone = 'UTC'
end
...
Run Code Online (Sandbox Code Playgroud)
坦率地说,我不确定这是做什么的......但不是我想要的.
我认为它的存在是因为我的布里斯班事件被存储为,2017-01-01 00:00但是当我为悉尼创建一个新事件时,它被存储为2017-01-01 01:00 …
dateutil rrule是否支持DST和TZ?需要类似于iCalendar RRULE的东西.
如果不是 - 如何解决这个问题(安排重复发生的事件和DST偏移变化)
进口
>>> from django.utils import timezone
>>> import pytz
>>> from datetime import timedelta
>>> from dateutil import rrule
>>> now = timezone.now()
>>> pl = pytz.timezone("Europe/Warsaw")
Run Code Online (Sandbox Code Playgroud)
timedelta问题(需要具有相同的当地时间,但不同的DST偏移):
>>> pl.normalize(now)
datetime.datetime(2012, 9, 20, 1, 16, 58, 226000, tzinfo=<DstTzInfo 'Europe/Warsaw' CEST+2:00:00 DST>)
>>> pl.normalize(now+timedelta(days=180))
datetime.datetime(2013, 3, 19, 0, 16, 58, 226000, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)
rrule问题(每次出现时需要每个当地时间相同):
>>> r = rrule.rrule(3,dtstart=now,interval=180,count=2)
>>> pl.normalize(r[0])
datetime.datetime(2012, 9, 20, 1, 16, 58, tzinfo=<DstTzInfo 'Europe/Warsaw' CEST+2:00:00 DST>)
>>> pl.normalize(r[1])
datetime.datetime(2013, …Run Code Online (Sandbox Code Playgroud)