java - 不更改时区的日期时间解析
问题描述
我在这里有字符串类型的日期和时间值。
- 应用日期 = 2/19/2019
- 开始时间 = 下午 4:15
我想通过 api 将一个事件插入到谷歌日历中。
当我解析日期字符串时,它会根据我的本地区域设置进行转换。我住在 GMT+03.00 时区。但我想在字符串中插入日期和时间。
输出:{dateTime=2019-01-19T04:15:00.000+03:00, timeZone=America/New_York}
我需要得到这个:{dateTime=2019-01-19T04:15:00.000-05:00, timeZone=America/New_York}
使用下面的代码块,它将晚上 8:15 插入到谷歌日历中。
SimpleDateFormat formatter = new SimpleDateFormat("mm/dd/yyyy HH:mm a", Locale.US);
String dateInString = appDate + " " + startTime;
Date date = formatter.parse(dateInString);
DateTime startDateTime = new DateTime(date);
EventDateTime start = new EventDateTime().setDateTime(startDateTime).setTimeZone("America/New_York");
解决方案
java.time
您遇到了围绕遗留类和相关类的非常常见的混淆来源。java.util.Date
您应该使用java.time
Java 8 中引入的较新的类:
System.out.printf("INFO - System default timezone: %s%n", ZoneId.systemDefault().getId());
// INFO - System default timezone: Europe/Moscow
// test data
String appDate = "2/19/2019";
String startTime = "4:15 PM";
String targetTimezone = "America/New_York";
String dateInString = appDate + " " + startTime;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy h:mm a");
LocalDateTime ldt = LocalDateTime.parse(dateInString, formatter);
ZonedDateTime zdt = ldt.atZone(ZoneId.of(targetTimezone));
System.out.println(zdt); // 2019-02-19T16:15-05:00[America/New_York]
如您所见,ZonedDateTime
已使用正确的本地时间 (16:15 = 4:15 PM)、正确的偏移量 (-05:00) 和明确指定的时区 (America/New_York) 创建。
如果幸运的话,Google Calendar API 将能够使用这些java.time
类。但是,如果您出于某种原因需要恢复为 a java.util.Date
,您始终可以通过调用添加到旧类的新方法来进行转换。Instant
从ZonedDateTime
(从区域调整为UTC )中提取一个,然后传递给新Date.from
方法。
java.util.Date date = java.util.Date.from( zdt.toInstant() );
System.out.println(date); // Wed Feb 20 00:15:00 MSK 2019
System.out.println(date.getTime()); // 1550610900000
请注意,java.util.Date
使用 JVM 的当前默认时区打印Europe/Moscow
,因此已相应调整日期和时间。但是,两个值 (2019-02-19T16:15-05:00[America/New_York]
和Wed Feb 20 00:15:00 MSK 2019
) 都表示同一时刻:纪元 ( 1970-01-01 00:00:00 UTC
) 之后的 1550610900000 毫秒。
推荐阅读
- html - 如何将网站背景设置为模糊的视频?
- javascript - 反应映射功能没有返回任何东西
- c# - Microsoft Graph 和 WPF 用户身份验证 - 自定义登录表单
- javascript - `document.documentElement` 的 offsetHeight 行为不同
- php - 从表中访问用户配置文件
- javascript - 如何计算几个总金额的总和?
- java - 从资源中读取文件 - 路径必须存在:/app/app.jar!/BOOT-INF/classes!/features/
- php - 419 页面在 laravel 5.7 中过期
- python - 运行 setup.py 后如何重命名 cx_Freeze 中的 exe.win-amd64-3.8 文件夹
- python-3.x - 使用python中的Windows命令提示符将文件复制到远程文件共享位置