如果存在 Zone,则显示带有附加 zoneOffset 值的 DateTime

Display DateTime with additional zoneOffset value if Zone is present

提问人:Thilakraj 提问时间:5/13/2023 更新时间:5/13/2023 访问量:59

问:

在以特定格式显示日期时间时,是否可以将偏移值添加到小时和日期

例: 假设日期时间存储在数据库中没有任何时区。 是否可以以特定格式(考虑 PST)显示为5/12/2023 23:18 PM5/12/2023 10:18 AM

尝试了以下方法

DateTimeFormatter COMMENT_DATE_TIME_FORMATTER_ZONE = DateTimeFormatter.ofPattern("M/d/y hh:mm a zzz");
ZonedDateTime zdt = ZonedDateTime.of(date, ZoneId.of("America/Los_Angeles"));
String zonfs = zdt.format(Constants.COMMENT_DATE_TIME_FORMATTER_ZONE); //5/12/2023 06:50 PM PDT

DateTimeFormatter COMMENT_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("M/d/y hh:mm a"); //5/12/2023 06:50 PM


SimpleDateFormat sdf = new SimpleDateFormat("M/d/y hh:mm a");
String sdfd =sdf.format(GregorianCalendar.from(zdt).getTime()); //5/13/2023 07:20 AM  here its increasing the day by 1
日期时间 java-time 时间格式 datetimeformatter

评论

2赞 Anonymous 5/13/2023
你没有理由让这个臭名昭著的麻烦和过时的类参与进来,而且你也不想这样做,java.time 和它为你提供了你需要的所有功能,包括格式化和解析。还要避免 .SimpleDateFormatDateTimeFormatterGregorianCalendar
1赞 Anonymous 5/13/2023
您首先需要知道您的数据库使用的是哪个时区。您无法从未知时区进行转换。太平洋标准时间是指菲律宾标准时间吗?皮特凯恩标准时间?这三个字母的缩写通常是模棱两可的。由于您的代码提到了美国/Los_Angeles,因此可能是您的意思,但请明确说明。
1赞 Basil Bourque 5/13/2023
也许不言而喻,但是如果您的日期和时间表示时间轴上的特定点,则应将这些值存储在类似于 SQL 标准类型的列中,而不是 .您在存储没有区域或偏移量的日期时间时所做的就像将价格存储为数字但忘记了货币一样,让您假设/猜测检索值的含义。TIMESTAMP WITH TIME ZONETIMESTAMP WITHOUT TIME ZONE
2赞 DevilsHnd - 退した 5/13/2023
5/12/2023 23:18 PM奇怪。。。为什么选择???PM

答:

2赞 Misha Zaslavsky 5/13/2023 #1

是的,这是可能的,试试这种方式:

LocalDateTime dateTime = LocalDateTime.of(2023, 5, 12, 23, 18);

Instant instant = dateTime.toInstant(ZoneOffset.UTC);
ZoneId pstZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime pstDateTime = instant.atZone(pstZone);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/y hh:mm a");
String formattedDateTime = pstDateTime.format(formatter);

评论

2赞 Anonymous 5/13/2023
假设数据库使用 UTC(通常建议使用 UTC),这是正确的。