simpledate格式未将时间转换为ist

m0rkklqb  于 2021-08-25  发布在  Java
关注(0)|答案(4)|浏览(285)

我试图从下面的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);
}
lokaqttq

lokaqttq1#

您正在使用默认时区(而不是utc)解析日期。
你从来没打过电话 format1.setTimeZone 在解析之前。dateformat使用默认时区,除非您将其设置为其他时区。
让我们看一下代码的每一行:

Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();

这就是获取默认时区。你不需要日历对象;只需调用timezone.getdefault()。

String timezoneID = timeZone.getID();

没有理由这么说。您已经有一个时区对象。将其转换为字符串id并返回时区是一个毫无意义的往返操作。因此,您应该删除 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);

由于SimpleDataFormat在创建时始终使用默认时区,因此无需调用此format对象的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());
csga3l58

csga3l582#

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);

在欧洲/都柏林时区运行时的输出:
15点17分
这是给爱尔兰夏季的。ist有好几种含义,我不确定你想要哪一种。另外,许多其他流行的时区缩写词都是模棱两可的。ist也可能是指以色列标准时间,但这里不是,因为以色列在每年的这个时候使用以色列昼时或idt。另一种解释是印度和斯里兰卡使用的印度标准时间,所以让我们试着在亚洲/加尔各答时区运行代码。
19时47分
我正在利用这样一个事实:您的字符串是iso 8601格式,java.time类解析并打印为默认格式,也就是说,没有任何指定的格式化程序。

你的代码出了什么问题?

您的错误在这里:

SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

你决不能硬编码 Z 作为格式模式中的文本,这是将其括在单引号中时所做的操作。这个 Z 是utc偏移量,需要将其解析为utc偏移量,以便java知道您的日期和时间是utc(即 Z 方法)。当您硬编码 Z , SimpleDateFormat 了解jvm默认时区中的日期和时间。因此,当您尝试转换到该时区时,一天中的时间不会改变。你正在转换成你已经拥有的时区。这是禁止的。

链接

oracle教程:说明如何使用java.time的日期时间。
维基百科文章:iso 8601
时区缩写-全球列表

yv5phkfx

yv5phkfx3#

format1.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); 这是您所需要的,因为3个字母的区域名称已不推荐使用。加上: String timezoneValue = format1.getTimeZone().getDisplayName(false, TimeZone.SHORT);

oipij1gg

oipij1gg4#

方法 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);

相关问题