为了账号安全,请及时绑定邮箱和手机立即绑定

如何在末尾没有时区的情况下将日期时间显示为当地时间?

如何在末尾没有时区的情况下将日期时间显示为当地时间?

温温酱 2023-03-17 16:04:56
编辑:由于有些看似混乱,让我澄清一下。如果可能的话,我希望解决方案在 freemarker 中而不是在 java 中完成。我有一个看起来像这样的日期时间字符串:2019-03-12T16:02:00+02:00 我必须以这样的特定格式显示它:EEEE dd. MMMM yyyy HH:mm 但是,如果我这样做,它会显示时间而14:02不是16:02. 它将日期时间转换为 UTC,然后显示它。我如何让它按原样显示小时和分钟,只是最后没有“utc”?或者与此相关的任何时区。 Tuesday 12. March 2019 16:02是所需的输出。我不知道收件人的时区。使用iso_local_nz给我的美国标准显示仍然是错误的。先感谢您。我已经尝试了几乎所有我能从这里想到的: https: //freemarker.apache.org/docs/ref_builtins_date.html#ref_builtin_date_iso。departureScheduled?datetime.iso?string("EEEE dd. MMMM yyyy HH:mmz")?capitalize我使用的配置如下:config = new Configuration(Configuration.VERSION_2_3_28);config.setTemplateLoader(new S3TemplateLoader());config.setDefaultEncoding("UTF-8");config.setLocalizedLookup(false);config.setLocale(Locale.forLanguageTag("NO"));config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);输入的字符串是我上面提供的字符串。
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

到目前为止,这不是一个好的解决方案,但它适用于我遇到的一种情况,即我要显示的时间在解析之前位于原始字符串中。

departureScheduled?keep_before("+")?datetime.iso?string("EEEE dd. MMMM yyyy HH:mm")?capitalize

注意keep_before("+").

+上面的解决方案通过删除in之后的任何内容来工作2019-03-12T16:02:00+02:00。然后,日期时间解析器假定时间为 UTC。因此,我通过使用一个内置的字符串操作函数来避免整个问题,该函数返回不会被进一步修改的子字符串:2019-03-12T16:02:00(+00:00)。括号显示了它是如何被解释的。

如果有人有更好的答案,我会将其标记为正确,但几天后,如果没有给出答案,我会将其标记为正确,以供可能遇到相同问题的任何人使用。



查看完整回答
反对 回复 2023-03-17
?
绝地无双

TA贡献1946条经验 获得超4个赞

使用该类java.time.OffsetDateTime来处理偏移量:


public static void main(String[] args) {

    String t = "2019-03-12T16:02:00+02:00";

    OffsetDateTime odt = OffsetDateTime.parse(t);

    System.out.println(odt.format(DateTimeFormatter.ofPattern("EEEE dd. MMMM yyyy HH:mm")));

}

此打印Dienstag 12. März 2019 16:02,翻译取决于您的系统默认值Locale。


请注意,正确的代码不会产生您想要的输出,因为 2019 年 3 月 12 日是星期二而不是星期一。


查看完整回答
反对 回复 2023-03-17
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

上面的答案都不适用于实际实现,所以我做了一些实验,这很完美(在 Java 中):


ZoneId userTimezone = ZoneId.of("Europe/Rome"); // To provide as parameter

DateTimeFormatter formatter = DateTimeFormatter

    .ofPattern("dd/MM/yyyy HH:mm")

    .withZone(userTimezone);


String formattedDateTime = <any instance of ZonedDateTime>

            .format(formatter);

// OR

String formattedDateTime = <any instance of LocalDateTime> // JVM with UTC time

            .atZone(ZoneId.of("UTC")) // Adds timezone info <- Very important

            .format(formatter);       // Transforms the time at the desired zone

该字符串现在可用于该时区用户将看到的任何模板/电子邮件。


UTC Value: 20/03/2022 10:00

Output:    20/03/2022 11:00 // Without the timezone at the end


查看完整回答
反对 回复 2023-03-17
  • 3 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号