我正在尝试围绕 Postgresql 时区进行思考,但我似乎无法弄清楚这一点。EST 是美国的“东部标准时间”,通常是UTC-5。
示例 1:基础测试
select '08/31/2011 12:00 pm EST'::timestamptz at time zone 'EST';
timezone
---------------------
2011-08-31 12:00:00
Run Code Online (Sandbox Code Playgroud)
示例 2:偏移量为 +5
select '08/31/2011 12:00 pm EST' at time zone '+5';
timezone
---------------------
2011-08-31 12:00:00
Run Code Online (Sandbox Code Playgroud)
示例 3:偏移量为 -5
select '08/31/2011 12:00 pm EST' at time zone '-5';
timezone
---------------------
2011-08-31 22:00:00
Run Code Online (Sandbox Code Playgroud)
显然,一切都在倒退。EST 再次......应该是 UTC-5。现在,我确实搜索了文档,它确实解释了事物是“POSIX”,这是向后的。(正偏移位于格林威治标准时间以西,而负偏移位于格林威治标准时间以东)。
但是,我该如何解决这个问题?在应用程序层,我总是可以将 + 号反转为 - 号,但这对我来说似乎有点麻烦 IMO。因此,我的终极问题。
在数据库层(Postgres),有没有办法使用“At Time Zone”语法让 GMT-5 对应于 EST?或者我只需要在应用程序层反转所有内容?
给出的格式字符串是什么strftime,可以提供与我看到的相同的输出isoformat(' ')?
>>> from datetime import datetime
>>> import pytz
>>> dt = datetime.now(tz=pytz.UTC).replace(microsecond=0)
>>> print dt
2014-05-29 13:11:00+00:00
>>> dt.isoformat(' ')
'2014-05-29 13:11:00+00:00'
>>> dt.strftime('%Y-%m-%d %H:%M:%S%z')
'2014-05-29 13:11:00+0000'
Run Code Online (Sandbox Code Playgroud)
__str__datetime 的行为在偏移量中从哪里得到额外的冒号?我查看了格式化选项,并且只能分别为+ HHMM或名称找到%z和%Z.
我查看了实现,datetime.__str__但没有提示,只是说pass(?!).我认为它最终会委托,isoformat(' ')但我不明白如何/在哪里实施.
我知道如何得到相反的结果。给定一个时区,我可以通过以下代码片段获取时区偏移量:
TimeZone tz = TimeZone.getDefault();
System.out.println(tz.getOffset(System.currentTimeMillis()));
Run Code Online (Sandbox Code Playgroud)
我想知道如何从时区偏移量获取时区名称。
鉴于,
timezone offset = 21600000(以毫秒为单位;+6.00 偏移量)
我想获得以下任何可能的时区名称的结果:
(GMT+6:00) Antarctica/Vostok
(GMT+6:00) Asia/Almaty
(GMT+6:00) Asia/Bishkek
(GMT+6:00) Asia/Dacca
(GMT+6:00) Asia/Dhaka
(GMT+6:00) Asia/Qyzylorda
(GMT+6:00) Asia/Thimbu
(GMT+6:00) Asia/Thimphu
(GMT+6:00) Asia/Yekaterinburg
(GMT+6:00) BST
(GMT+6:00) Etc/GMT-6
(GMT+6:00) Indian/Chagos
Run Code Online (Sandbox Code Playgroud) 我需要转换GMT为亚利桑那州时间。亚利桑那州目前已MST关闭夏令时。
然而在 Joda TimeDateTimeZone代码中,MST已映射到America/Denver:
map.put("MST", "America/Denver");
Run Code Online (Sandbox Code Playgroud)
可以看出,目前丹佛实行夏令时,因此有MDT。DateTimeZone那么为什么要在代码中进行这样的映射呢?
在从 转换为亚利桑那州本地时区时GMT,我得到了偏移量,因为GMT-6这是错误的,而且应该是这样GMT-7,因为MST没有夏令时。
这是一个错误吗?如何解决问题?
我正在尝试使用此代码来解析带有时区的日期字符串进行测试:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZZZZZ", Locale.US);
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse("2017-07-26T06:00-06:00"));
int offset = calendar.getTimeZone().getRawOffset();
Run Code Online (Sandbox Code Playgroud)
我正在尝试将时区从 更改-06为+09,但offset始终包含10800000.
如何正确解析带有时区的日期(我需要时间和时区)?
我正在开发一个应用程序,它从Google TimeZone API. 只是我有时间在地球上所需的地方以毫秒为单位。
例如:1504760156000它显示的是伦敦的日期时间
2017 年 9 月 7 日星期四 09:55:56
由于我在+05:00UTC 的时区,如果我操纵1504760156000这些毫秒,它将显示整个日期时间,如下所示:
2017 年 9 月 7 日星期四 09:55:56 GMT+0500(巴基斯坦标准时间)
但我想表明:
2017 年 9 月 7 日星期四 09:55:56 GMT+0100(英国夏令时间)
问题是:我有正确的伦敦日期和时间,但可以在不更改时间的情况下显示/更改时区,因为根据伦敦时间是正确的。
更新
得到一些评论后。在我的例子中,你没有把我带到这里。
假设我在巴基斯坦,时间在这里,1:55 PM所以我通过我的应用程序要求 GOOGLE API 告诉我伦敦的时间是什么时候。Google API 告诉我伦敦的时间是1504760156000(上午 9 点 55 分)以毫秒为单位,如果我将这些毫秒转换为Date对象,它将打印如下:
Date date =new Date(1504760156000)
Run Code Online (Sandbox Code Playgroud)
2017 年 9 月 7 日星期四 09:55:56 GMT+0500(巴基斯坦标准时间)
它会根据我的本地时区操作它,但我想要如下结果
2017 年 9 月 7 日星期四 09:55:56 …
我需要计算出两个时区之间的小时差,当前面的时区移动到第二天时,我遇到了一些问题。
例子:
//Let's say it is 11pm 23:00 in LA
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);
$local_hour = $local->format('H');
//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);
$user_hour = $user->format('H');
Run Code Online (Sandbox Code Playgroud)
按照这个问题中的例子(计算不同时区日期之间的小时数)我得到了一个不正确的结果:
$diff = $user_tz->getOffset($local);
error_log('$diff '.gmdate("H:i:s", $diff)); //outputs 20:00:00
Run Code Online (Sandbox Code Playgroud)
如果在洛杉矶是下午 4 点,那么在纽约是下午 7 点,那么很容易:
$time_diff = ($user_h - $local_h); //$time_diff = 3;
Run Code Online (Sandbox Code Playgroud)
但是当纽约移动到第二天时,我再次得到错误的结果:
$time_diff = ($user_h - $local_h); //$time_diff = -21;
Run Code Online (Sandbox Code Playgroud)
那么我该如何解释另一个时区已经移动到新的一天呢?
我正在从Google和Microsoft获取用户的日历时区。Google 在其日历 API响应中提供时区区域:
timezone: Asia/Kolkata
虽然Microsoft Graph API提供了这样的时区详细信息,但timezone: 'Indian Standard Time'
我想以offset秒为单位找到时区以对日期对象执行一些操作。
是否有不同的方式或某些来源可以让我以csv或json的形式获取所有这些详细信息,这些详细信息可以导入到数据库表中并用于进一步的操作?
PS:我查看了一些示例,moment.js但发现它对我的用例没有帮助
我有这个代码:
String date = "2019-04-22T00:00:00+02:00";
OffsetDateTime odt = OffsetDateTime
.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
.withOffsetSameInstant(ZoneOffset.of("+00:00"));
System.out.println(odt);
Run Code Online (Sandbox Code Playgroud)
这个打印: 2019-04-21T22:00Z
如何打印2019-04-21T22:00+00:00?用 offset 代替Z.
我需要以秒为单位获取本地时间和 UTC 时间。我在 StackOverflow 中阅读了一些帖子并找到了一些解决方案,正如前面提到的那样:
Instant time = Instant.now();
OffsetDateTime utc = time.atOffset(ZoneOffset.UTC);
int utcTime = (int) utc.toEpochSecond();
int localTime = (int) time.getEpochSecond();
System.out.println("utc " + utcTime + " local " + localTime);
Run Code Online (Sandbox Code Playgroud)
但结果并不是我所期望的。现在是UTC时间。输出:
utc 1593762925
local 1593762925
Run Code Online (Sandbox Code Playgroud)
调试后我发现 Instant.now() 已经是 utc。我找不到如何在当前时区(即我的系统区域)中获取时间。
我在 API 中找到了一些解决方案,但出现错误:
OffsetDateTime utc = time.atOffset(ZoneOffset.of(ZoneOffset.systemDefault().getId()));
Run Code Online (Sandbox Code Playgroud)
线程“main”中的异常 java.time.DateTimeException:ZoneOffset 的 ID 无效,格式无效:Europe/Astrakhan 在 java.base/java.time.ZoneOffset.of(ZoneOffset.java:241)
UPD:我的问题是如何在本地时区和 UTC 中以秒为单位获取当前时间?即自 1970-01-01T00:00:00 GMT+4 和 1970-01-01T00:00:00 GMT+0 以来的秒数
UPD2:我有一些设备需要从 1970 年开始以秒为单位的 UTC 时间和以秒为单位的发件人本地时间响应。为什么?我不知道。对我来说是黑匣子。
timezone-offset ×10
timezone ×6
java ×4
datetime ×3
android ×2
calendar ×1
date ×1
google-api ×1
java-time ×1
javascript ×1
jodatime ×1
php ×1
postgresql ×1
python ×1
time ×1