如何从ZonedDateTime执行偏移操作得到11或11:00时间值?
解决ZonedDateTime转多时区并提取小时/时分格式的问题
嘿,我来帮你搞定这个需求!你已经有了纽约时区的ZonedDateTime实例,要转换成其他时区的时间并提取11或11:00这样的格式填充ComboBox,其实两步就能搞定:时区转换 + 格式化输出。
第一步:转换到目标时区
ZonedDateTime自带的withZoneSameInstant()方法就是你要找的“实际偏移操作”——它会保持同一时刻,把时间转换到你指定的时区。比如你需要转UTC和另外两个时区,先定义好目标时区:
// 示例:定义三个目标时区(你可以换成自己需要的) ZoneId utcZone = ZoneOffset.UTC; ZoneId berlinZone = ZoneId.of("Europe/Berlin"); ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai");
然后从你现有的纽约时区实例转换过去:
// 转换到UTC ZonedDateTime utcZdt = zdt.withZoneSameInstant(utcZone); // 转换到柏林时区 ZonedDateTime berlinZdt = zdt.withZoneSameInstant(berlinZone); // 转换到上海时区 ZonedDateTime shanghaiZdt = zdt.withZoneSameInstant(shanghaiZone);
第二步:格式化出你要的格式
用DateTimeFormatter就能轻松提取小时或者“小时:分钟”的格式:
- 如果只需要纯小时数字(比如
11),用格式字符串"HH"(24小时制,要是12小时制用"hh") - 如果需要
11:00这样的时分格式,用"HH:mm"
代码示例:
// 格式化纯小时 DateTimeFormatter hourOnlyFormatter = DateTimeFormatter.ofPattern("HH"); String utcHour = utcZdt.format(hourOnlyFormatter); String berlinHour = berlinZdt.format(hourOnlyFormatter); String shanghaiHour = shanghaiZdt.format(hourOnlyFormatter); // 格式化小时:分钟 DateTimeFormatter hourMinFormatter = DateTimeFormatter.ofPattern("HH:mm"); String utcHourMin = utcZdt.format(hourMinFormatter); String berlinHourMin = berlinZdt.format(hourMinFormatter); String shanghaiHourMin = shanghaiZdt.format(hourMinFormatter);
针对你给出的实例测试
你提供的zdt = 2018-05-18T15:00-04:00[America/New_York],转换后:
- UTC时间是
2018-05-18T19:00Z,所以格式化后是19或19:00 - 柏林当时是夏令时(UTC+2),时间是
2018-05-18T21:00+02:00,格式化后是21或21:00 - 上海时区是UTC+8,时间是
2018-05-19T03:00+08:00,格式化后是03或03:00
把这些格式化后的字符串直接放到ComboBox里就可以啦!
内容的提问来源于stack exchange,提问作者benjaminadk
相关产品推荐
相关产品推荐

