SimpleDateformat 没有将时间转换为 IST
SimpleDate format is not converting time to 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);
}
format1.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
是您所需要的,因为 3 个字母的区域名称确实已被弃用。加上:
String timezoneValue = format1.getTimeZone().getDisplayName(false, TimeZone.SHORT);
方法 Calendar.getInstance()
使用默认时区和区域设置 - UTC±00:00 获取日历。
使用 "IST"
而不是 timeZone.getID()
。
示例:
String date="2021-07-05T14:17:00.000Z";
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
String timezoneID = "IST"; // <<<<<
// Convert to System format from UTC
DateFormat 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);
您正在使用默认时区而不是 UTC 解析日期。
您从未在 解析之前调用 format1.setTimeZone
。 DateFormat 使用默认时区,除非您将其设置为其他时区。
让我们看看你的每一行代码:
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
即获取默认时区。你不需要 Calendar 对象;只需调用 TimeZone.getDefault().
String timezoneID = timeZone.getID();
没有理由这样称呼。您已经有一个 TimeZone 对象。将它转换为字符串 ID 并返回到 TimeZone 是一个毫无意义的往返操作。因此,您应该删除 timezoneID
.
的所有使用
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
这就是问题所在。 DateFormat 不会将 'Z'
视为任何特殊的东西;它只是 DateFormat 知道不解析的文字字符。
您实际上需要告诉 DateFormat 它正在解析 UTC 时间:
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
TimeZone utc = TimeZone.getTimeZone(ZoneOffset.UTC);
format1.setTimeZone(utc);
Date actualDate = format1.parse(date);
与其删除格式化字符串的片段,不如制作一个完全符合您要求的新 DateFormat:
DateFormat timeFormat = new SimpleDateFormat("HH:mm z");
String finalTime = timeFormat.format(actualDate);
由于 SimpleDateFormat 在创建时总是使用默认的 TimeZone,因此无需调用此格式对象的 setTimeZone 方法。
我应该提到 java.time 和 java.time.format 包更适合处理日期和时间:
String date = "2021-07-05T14:17:00.000Z";
Instant instant = Instant.parse(date);
ZonedDateTime utcDateTime = instant.atZone(ZoneOffset.UTC);
ZonedDateTime istDateTime =
utcDateTime.withZoneSameInstant(ZoneId.systemDefault());
String finalTime = String.format("%tR %<tZ", istDateTime);
// Or:
// String finalTime = istDateTime.toLocalTime() + " "
// + itsDateTime.getZone().getDisplayName(
// TextStyle.SHORT, Locale.getDefault());
java.time
我强烈建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。然后你的任务变得非常简单。我不想为您的输入格式定义一个格式化程序,而是为您想要的时间格式定义一个格式化程序:
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);
我在Europe/Dublin时区运行时的输出:
15:17 IST
这里的 IST 是爱尔兰夏令时。 IST 有多种含义,我不确定您指的是哪一种。许多其他流行的时区缩写也是模棱两可的。 IST 也可能表示以色列标准时间,但在这里不是,因为以色列在每年的这个时候使用以色列夏令时或 IDT。另一种解释是印度和斯里兰卡使用的印度标准时间,所以让我们试试 运行 Asia/Kolkata 时区的代码。
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 的默认时区。因此,当您之后尝试转换为该时区时,一天中的时间不会改变。您正在转换为已有的时区。这是一个空操作。
链接
我正在尝试从下面的 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);
}
format1.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
是您所需要的,因为 3 个字母的区域名称确实已被弃用。加上:
String timezoneValue = format1.getTimeZone().getDisplayName(false, TimeZone.SHORT);
方法 Calendar.getInstance()
使用默认时区和区域设置 - UTC±00:00 获取日历。
使用 "IST"
而不是 timeZone.getID()
。
示例:
String date="2021-07-05T14:17:00.000Z";
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
String timezoneID = "IST"; // <<<<<
// Convert to System format from UTC
DateFormat 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);
您正在使用默认时区而不是 UTC 解析日期。
您从未在 解析之前调用 format1.setTimeZone
。 DateFormat 使用默认时区,除非您将其设置为其他时区。
让我们看看你的每一行代码:
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
即获取默认时区。你不需要 Calendar 对象;只需调用 TimeZone.getDefault().
String timezoneID = timeZone.getID();
没有理由这样称呼。您已经有一个 TimeZone 对象。将它转换为字符串 ID 并返回到 TimeZone 是一个毫无意义的往返操作。因此,您应该删除 timezoneID
.
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
这就是问题所在。 DateFormat 不会将 'Z'
视为任何特殊的东西;它只是 DateFormat 知道不解析的文字字符。
您实际上需要告诉 DateFormat 它正在解析 UTC 时间:
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
TimeZone utc = TimeZone.getTimeZone(ZoneOffset.UTC);
format1.setTimeZone(utc);
Date actualDate = format1.parse(date);
与其删除格式化字符串的片段,不如制作一个完全符合您要求的新 DateFormat:
DateFormat timeFormat = new SimpleDateFormat("HH:mm z");
String finalTime = timeFormat.format(actualDate);
由于 SimpleDateFormat 在创建时总是使用默认的 TimeZone,因此无需调用此格式对象的 setTimeZone 方法。
我应该提到 java.time 和 java.time.format 包更适合处理日期和时间:
String date = "2021-07-05T14:17:00.000Z";
Instant instant = Instant.parse(date);
ZonedDateTime utcDateTime = instant.atZone(ZoneOffset.UTC);
ZonedDateTime istDateTime =
utcDateTime.withZoneSameInstant(ZoneId.systemDefault());
String finalTime = String.format("%tR %<tZ", istDateTime);
// Or:
// String finalTime = istDateTime.toLocalTime() + " "
// + itsDateTime.getZone().getDisplayName(
// TextStyle.SHORT, Locale.getDefault());
java.time
我强烈建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。然后你的任务变得非常简单。我不想为您的输入格式定义一个格式化程序,而是为您想要的时间格式定义一个格式化程序:
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);
我在Europe/Dublin时区运行时的输出:
15:17 IST
这里的 IST 是爱尔兰夏令时。 IST 有多种含义,我不确定您指的是哪一种。许多其他流行的时区缩写也是模棱两可的。 IST 也可能表示以色列标准时间,但在这里不是,因为以色列在每年的这个时候使用以色列夏令时或 IDT。另一种解释是印度和斯里兰卡使用的印度标准时间,所以让我们试试 运行 Asia/Kolkata 时区的代码。
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 的默认时区。因此,当您之后尝试转换为该时区时,一天中的时间不会改变。您正在转换为已有的时区。这是一个空操作。