我住在一个他们每年两次更改时间的国家。也就是说:一年中有一段时间,UTC的偏移量是-3小时(-180分钟),而其他时间段的偏移量是-4小时(-240分钟)
严重地:
|------- (offset = -3) -------|------- (offset is -4) -------|
start of year mid end of year
Run Code Online (Sandbox Code Playgroud)
我的问题是:
“时区”只是代表偏移量的数字吗?那就是:我的国家有两个时区?或时区包含此信息?
这很重要,因为我将每个日期保存在数据库的UTC时区(偏移= 0)中。
相反,我是否也应该使用本地时区保存日期并保存其偏移量(保存时)?
这是一个通过使用时区UTC保存日期而看到的问题的示例:
假设我有一个人们可以发送消息的系统。
我想在统计部分中绘制“每小时发送的邮件v / s”(即:“每天按小时发送的邮件”)
可以说整个数据库中只有两条消息:
然后,如果我在8月2日创建该图,将那些UTC日期转换为本地将得到以下信息:“ 2条消息在下午1点发送”。
我尝试索引包含日期的字段。
如何索引来自不同时区的日期?
我已经像这样设置了我的 elasticsearch 字段: 'requested_dt': {"type": "date", "format": "date_time_no_millis"} 'local_dt': {"type": "date", "format": "date_time_no_millis" "}
我试图索引这些值 (local_dt) :(requested_dt 是法国的当前时间)
IT 2016-10-27T23:46:17Z
GB 2016-10-27T22:46:19Z
Run Code Online (Sandbox Code Playgroud)
我没有通过 Kibana 得到预期的结果:
[local_dt]
IT October 28th 2016, 01:46:17.000
GB October 28th 2016, 00:46:19.000
[requested_dt]
IT October 27th 2016, 23:46:17.000
GB October 27th 2016, 23:46:19.000
Run Code Online (Sandbox Code Playgroud)
所以,对于requested_dt,我得到了我的期望。
对于local_dt,我没有得到我想要的。
我试图用 UTC 偏移量替换 Z 值,但我无法获得正确的输出。
有没有人能够向我解释如何为我想要的每个时区获得正确的输出?
这个 SQL:
select to_timestamp(extract(epoch from '0001-01-01 00:00:00'::timestamp))
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
0001-01-01 08:06:00+08:06
我意识到to_timestamp()总是添加一个时区,因此额外的 8 小时和+8时区部分。但什么是:06?额外的 6 分钟从哪里来?
编辑
如果我最初执行,set local timezone to 'UTC';那么我会得到预期的结果。
postgresql timestamp timezone-offset timestamp-with-timezone postgresql-9.6
这失败了。
\n\nOffsetDateTime.now()\n .format( \n DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG )\n ) // throws DateTimeException.\nRun Code Online (Sandbox Code Playgroud)\n\n但作品中的同一时刻具有相同的偏移量ZonedDateTime。
为什么?
\n\n当让自动本地化viajava.time的字符串表示形式时,如果格式化程序带有of或 ,则调用可以工作。但是当格式化程序携带or时,会抛出a 。然而,使用相同的时刻和相同的偏移量成功了。为什么?OffsetDateTimeDateTimeFormatter.ofLocalizedDateTimeformatFormatStyleSHORTMEDIUMLONGFULLDateTimeExceptionZonedDateTime
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ) ;\n\nOffsetDateTime odt = OffsetDateTime.now( ZoneId.systemDefault() ) ;\nZonedDateTime zdt = odt.atZoneSameInstant( odt.getOffset() ) ; // Generate a `ZonedDateTime` with same moment and same offset as the `OffsetDateTime`.\n\n// Succeeds.\nString outputZdt = zdt.format( f ) ;\nSystem.out.println( …Run Code Online (Sandbox Code Playgroud) 我的问题很简单。如何获取菲律宾的 UTC 偏移量(+8)和日本的 UTC 偏移量(+9),并将其转换为整数。
任何建议都是很大的帮助。谢谢。
更新
为了进一步说明,我有一个 C++ 桌面应用程序,无论使用该应用程序,我都需要自动检测其时区。就像如果应用程序将在日本使用一样,将使用日本的时区偏移。那可能吗?
将 DateTimeOffset 转换为另一个 TimeZone 时,OffSet 不正确。
我读过很多文章并尝试了太多时间,但看不出我在这里缺少什么:
// It's June in the UK and we're in British Summer Time, which is 1 hour ahead of UTC (GMT)
var UKoffsetUtc = new TimeSpan(1, 0, 0);
// It's 4pm - declare local time as a DateTimeOffset
var UKdateTimeOffset = new DateTimeOffset(2020, 6, 17, 16, 0, 0, UKoffsetUtc);
// Convert to UTC as a date
var utc = DateTime.SpecifyKind(UKdateTimeOffset.UtcDateTime, DateTimeKind.Utc);
// Get Aus TimeZoneInfo
var AUSTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
// Check …Run Code Online (Sandbox Code Playgroud) 我想编写一个脚本,每天下午2点向用户的手机发送推送通知.但是有来自世界各地的用户,所以我需要根据特定用户的时区发送该通知,我将其保存在DB中,如"GMT + 4".
我需要通过Cron工作来做到这一点.我从来没有使用它,所以我不知道如何编写该脚本并使其在PHP中工作.有人可以帮帮我吗?
我正在使用ISO 8601中的日期时间格式。我有以下模式:
"yyyy-MM-dd'T'HH:mm:ssZZ'Z'"
输出为:
"2015-11-17T00:00:00+0000Z"。
我的问题是,输出是否正常,如果考虑到日期+0000和Z都可能具有相同的含义,则表示时区偏移量/ id。在此先感谢您的澄清=)
我想获得洛杉矶的时区信息,现在10/10/2017是夏令时,但当我在洛杉矶以两种方式获得时区时,我得到了不同的结果.
public class TimeZoneDemo2 {
public static void main(String[] args) {
TimeZone timeZoneLosAngeles =
TimeZone.getTimeZone("America/Los_Angeles");
System.out.println(timeZoneLosAngeles);
TimeZone timeZoneGmtMinus07 = TimeZone.getTimeZone("GMT-07:00");
System.out.println(timeZoneGmtMinus07);
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
sun.util.calendar.ZoneInfo [ID = "美国/洛杉矶",偏移= -28800000,dstSavings = 3600000,useDaylight =真,过渡= 185,lastRule = java.util.SimpleTimeZone中[ID =美洲/洛杉矶,偏移= - 28800000,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 3,startMonth = 2,朝九特派= 8,startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endday指定= 1,一个endDayOfWeek = 1,结束时间= 7200000,endTimeMode = 0]]
sun.util.calendar.ZoneInfo [ID = "GMT-07:00",偏移= -25200000,dstSavings = 0,useDaylight =假,过渡= 0,lastRule =空]
我的问题是:"America/Los_Angeles"获得的有关夏令时时区信息的信息.为什么不在"GMT -0700"获得的时区信息中包含夏令时信息(useDaylight = false)?
我们正在从贸易伙伴的API下载数据.直到现在我们正在使用"E. Australia Standard Time"并且工作正常.
在夏令时开始后,我们的贸易伙伴表示他们正在使用"澳大利亚东部夏令时(AEDT)".
我使用以下代码从UTC转换为"E. Australia Standard Time".
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time");
DateTime TPDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, objTimeZoneInfo);
Run Code Online (Sandbox Code Playgroud)
但是当我使用"E. Australia Daylight Time"或"Australian Eastern Daylight Time(AEDT)"时,我会听到以下错误
The time zone ID 'E. Australia Daylight Time' was not found on the local computer.
The time zone ID 'Australian Eastern Daylight Time (AEDT)' was not found on the local computer.
Run Code Online (Sandbox Code Playgroud)
我应该将什么时区ID传递给FindSystemTimeZoneById()方法以正确转换为澳大利亚东部夏令时(AEDT)?