【问题标题】:Convert date with known timezone to UTC date将具有已知时区的日期转换为 UTC 日期
【发布时间】:2015-11-13 16:27:13
【问题描述】:

日期和时间转换一直是我的薄弱环节。我有以下字符串格式的值:

  1. String date="2015-08-21 03:15" 和该日期的时区是
  2. String timeZone="GMT+05:30";

现在我需要将这个我已经知道时区的日期转换为 UTC 日期。

【问题讨论】:

  • 你可以使用 Java 8 日期/时间 API 吗?
  • @MickMnemonic 我只使用 Java8
  • 仅供参考,存在严重缺陷的日期时间类,如 java.util.Date、java.util.Calendar、GregorianCalendar 和 java.text.SimpleDateFormat 现在是 legacy,被内置的 java.time 类所取代Java 8 及更高版本。查看正确的Answer by Hochschild。

标签: java datetime timezone timezone-offset


【解决方案1】:

如果您在“GMT+05:30”时区指定时间,则下一个代码会将其转换为 UTC 时区:

String strDate = "2015-08-21 03:15";
String timeZone="GMT+05:30";
String format = "yyyy-MM-dd HH:mmz";
SimpleDateFormat formatter = new SimpleDateFormat(format);
Date dateStr = formatter.parse(strDate+timeZone);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = formatter.format(dateStr);
System.out.println("UTC datetime is: "+formattedDate);

【讨论】:

  • 您的代码给出的输出为 2015-08-20 22:15 Z 根据这个网站,它应该是 21- Aug 9:45 pm worldtimeserver.com/…
  • @HiteshBhutani 我稍微更新了代码。正确答案是 20-8 月 21:45 UTC。是的,应该是 8 月 20 日,而不是 21 日,因为 UTC 落后于 GMT+5:30
  • 完美。是的,正确答案是 8 月 20 日。我在发布评论后意识到它不正确但忘记更新。谢谢你的救援。我会将答案标记为已接受。
【解决方案2】:

你可以这样试试:

方法一:使用Java Date:

//Your input date string
String date="2015-08-21 03:15";

// date format your string
String format = "yyyy-MM-dd HH:mm";

//Create SimpleDateFormat instance
SimpleDateFormat sdf = new SimpleDateFormat(format);

// Convert Local Time to UTC 
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

//parse your input date string to UTC date
Date gmtTime = new Date(sdf.parse(date));

方法 2:使用 Joda 时间(推荐)

String dateString = "2015-08-21 03:15:00+5:30";

String pattern = "yyyy-MM-dd HH:mm:ssZ";

DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern);

DateTime dateTime = dtf.parseDateTime(dateString);

System.out.println(dateTime);

【讨论】:

  • 在您的代码中,我没有看到您使用了 GMT+05:30 时区。您所写的内容将获取服务器的默认时区并将其转换为 UTC 时间。假设您的代码在 MST 时区的服务器上运行。它将日期 2015-08-21 03:15 视为 MST 日期并将其转换为 UTC 日期。这是我不想要的。我已经知道这个日期是 GMT+05:30 时区,即 IST,需要将其转换为 UTC 时间。
  • @HiteshBhutani .. 我更新了答案,您需要 Joda 时间来处理 +5:30 的案例。
【解决方案3】:

因为您只需要 Java-8 解决方案:

String input = "2015-08-21 03:15";
String offsetInfo = "GMT+05:30";

LocalDateTime ldt = 
  LocalDateTime.parse(input, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm"));
ZoneOffset offset = 
  ZoneOffset.of(offsetInfo.substring(3)); // GMT-prefix needs to be filtered out

LocalDateTime result = 
  ldt.atOffset(offset).withOffsetSameInstant(ZoneOffset.UTC).toLocalDateTime();
System.out.print(result); // output: 2015-08-20T21:45

【讨论】:

    【解决方案4】:

    java 中的Date 表示自 1970 年以来的毫秒数。仅此数字没有特定的时区。这意味着如果您使用new Date() 创建一个日期,您将获得自 1970 年以来的当前毫秒数,并且如果您在其上调用 toString,则该值将在您当前的语言环境时区中表示。这个数字代表的实际时间是特定于时区的。这就是您可以在 Calendar 和 Format 类上设置 TimeZone 的原因。

    要实例化具有特定时区的日历,您可以这样做:

    public static Calendar getUtcCalendar() {
       GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
    }
    

    因此要将 Date 转换为 UTC 时区中的特定时间:

    Calendar calendar = getUtcCalendar();
    calendar.setTime(date);
    return calendar;
    

    【讨论】:

      【解决方案5】:

      你可以看到:

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
      Date date = null;
      try {
          //Here you say to java the initial timezone. This is the secret
          sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
          date = sdf.parse(review);
      } catch (ParseException e) {
          e.printStackTrace();
        }
      
      //Here you set to your timezone
      sdf.setTimeZone(TimeZone.getDefault());
      System.out.println(sdf.format(date));
      

      【讨论】:

      • 什么是review?据我所知,这是试图将 UTC 日期转换为本地日期(这不是 OP 所要求的)。
      猜你喜欢
      • 1970-01-01
      • 2019-09-07
      • 2014-01-14
      • 2014-05-27
      • 1970-01-01
      • 2011-08-30
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多