java - SimpleDate 格式未将时间转换为 IST
问题描述
我正在尝试以 IST 格式从下面的代码中获取时间 (HH:MM),但它仍然显示 UTC 日期、时间。请帮忙。
public static void main (String args[]) throws ParseException {
String date = "2021-07-05T14:17:00.000Z";
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
String timezoneID = timeZone.getID();
// Convert to System format from UTC
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date actualDate = format1.parse(date);
format1.setTimeZone(TimeZone.getTimeZone(timezoneID));
String date1 = format1.format(actualDate);
String time = date1.substring(11, 16);
String timezoneValue = TimeZone.getTimeZone(timezoneID).getDisplayName(false, TimeZone.SHORT);
String finalTime = time + " " + timezoneValue;
System.out.print(finalTime);
}
解决方案
java.time
我强烈建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。然后你的任务就变得很简单了。而不是您的输入格式的格式化程序,我想为您想要的时间格式定义一个格式化程序:
private static final DateTimeFormatter TIME_FORMATTER
= DateTimeFormatter.ofPattern("HH:mm zzz", Locale.ENGLISH);
现在操作分为以下几行:
String date = "2021-07-05T14:17:00.000Z";
String finalTime = Instant.parse(date)
.atZone(ZoneId.systemDefault())
.format(TIME_FORMATTER);
System.out.println(finalTime);
我在欧洲/都柏林时区跑步时的输出:
15:17 IST
IST 代表爱尔兰夏令时。IST 有多种含义,我不确定您想要的是哪一种。此外,许多其他流行的时区缩写也是模棱两可的。IST 也可能表示以色列标准时间,但不是在这里,因为以色列在一年中的这个时候使用以色列夏令时或 IDT。另一种解释是印度和斯里兰卡使用的印度标准时间,所以让我们尝试在亚洲/加尔各答时区运行代码。
19:47 IST
我正在利用您的字符串采用 ISO 8601 格式这一事实,即 java.time 类解析并打印为默认格式的格式,即没有任何指定的格式化程序。
你的代码出了什么问题?
你的错误在这里:
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
您绝不能Z
在格式模式中硬编码为文字,这就是您将其括在单引号中时所做的事情。这Z
是一个 UTC 偏移量,需要这样解析,以便 Java 知道您的日期和时间是 UTC(这就是什么Z
意思)。当您对 进行硬编码时,会将Z
日期SimpleDateFormat
和时间理解为 JVM 的默认时区。因此,当您之后尝试转换到该时区时,一天中的时间不会改变。您正在转换为已有的时区。这是一个无操作。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- 维基百科文章:ISO 8601
- 时区缩写 - 全球列表
推荐阅读
- javascript - 如何制作一个以自身为目标的JS函数以避免冲突
- javascript - Chrome 不断为 SSE 发送 GET
- javascript - 在 Svelte 组件中切换类
- python - 对 Pandas DataFrame.apply() 的困惑
- javascript - Javascript 访问剪贴板,没有 http/local 文件上的事件
- flutter - 无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店
- c++ - 未从编译静态库 C++(Linux 内核)中获取 .a 文件
- c++ - 模块最终允许标准库实现中的可读名称吗?
- node.js - 我收到 TypeError: Cannot read property 'numberOfSuits' of undefined 当我运行下面的代码在我的 firebase 数据库上发布新订单时
- json - 高效的 MongoDB 查询从一个集合中获取报告并插入到另一个集合中