当前位置: 首页 > 知识库问答 >
问题:

将输入字符串日期时间从不同时区转换为UTC

夏侯星洲
2023-03-14

位于新加坡(时区-“亚洲/新加坡”)的我的系统从印度尼西亚(时区-“亚洲/新加坡”)的外部系统接收字符串datetime(yyyy-MM-dd HH:MM:ss)。

如何在java 1.7中将收到的String日期时间转换为UTC?

这是我的代码:

public void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jarkarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat(DateTimeUtils.DATE_TIME_FORMAT);
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat(DateTimeUtils.ISO_DATE_TIME_FORMAT);
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
        fromDate = inputSdf.parse(inputTime);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // UTC: 2018-02-02T10:09:00.000Z. Expected 2018-02-02T03:09:00.000Z
}

共有2个答案

燕超
2023-03-14

我检查了你的密码时区有个拼写错误,所以我改正了

  public static void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jakarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
      fromDate = inputSdf.parse(inputTime);
    }
    catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // print this UTC: 2018-02-02 03:09:00. 
  }
仲孙鸿飞
2023-03-14

janith1024的答案是正确的。然而,我认为真正的问题是,旧的(而且早已过时的)时区类表现糟糕,不会通知您拼写错误。毕竟,我们都能做到。因此,真正的解决方案是使用java.time,即现代java日期和时间API。在Java 7(和6)上,将ThreeTen Backport添加到项目中,导入:

import org.threeten.bp.ZoneId;

然后呢:

        ZoneId inputTz = ZoneId.of("Asia/Jarkarta");

这将为您提供一个org.threeten.bp.zone.zoneRuleException:未知时区ID:Asia/Jarkarta。我应该说,这大大增加了你发现拼写错误的机会(正确的拼写是Asia/Jakarta)。

TimeZone.getTimeZone()的文档说明它返回

指定的TimeZone,如果无法理解给定ID,则为GMT区域。

然而,我张贴这个答案,因为你的问题不仅仅是一个单独的例子。我们一次又一次地看到来自旧日期和时间类的堆栈溢出问题,这些问题表现出令人惊讶的行为,特别是我们传递给它们的数据中没有检测到容易检测到的问题。我强烈建议使用现代API。

在Java8和更高版本中,Java.time是内置的,您应该使用子包从Java.time导入日期和时间类,而不是从org.threeten.bp导入。

  • Oracle教程:解释如何使用java.time的Date Time。
  • Java规范请求(JSR)310,其中首次描述了java.time
  • Threeten Backport项目,是java.time到Java6和7的Backport(用于JSR-310的Threeten)。
  • ThreeTenABP, Android版的Threeten Backport
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释。
 类似资料:
  • 我有YYYYMMDD格式的日期字符串,我试图使用日期格式化程序将其解析为日期 如果我用不同的日期一遍又一遍地运行相同的结果,我会得到不同的输出 20120331>>英国夏令时>>格式化后的日期:SAT 3月31日01:00:00英国夏令时2012 20121231>>GMT>>格式化后的日期:Mon Dec 31 00:00:00 GMT 2012 20130328>>GMT>>格式化后的日期:T

  • 问题内容: 我在mysql中使用NOW()获取当前日期和时间。我想将日期值转换为varchar并将其与另一个字符串连接。我该怎么做? 问题答案: 使用DATE_FORMAT()

  • 问题内容: 例如字符串: 我将把它们推回到数据库中正确的日期时间字段中,因此我需要将它们魔术化为实际的日期时间对象。 这是通过Django的ORM进行的,因此我无法使用SQL进行插入时的转换。 问题答案: 是将字符串解析为日期时间的主要例程。它可以处理各种格式,格式由你为其指定的格式字符串确定: 生成的对象是时区未使用的。 链接: 适用于strptime:Python 2和Python 3的 Py

  • 问题内容: 我从来没有不得不将时间与UTC转换。最近有人要求我的应用注意时区,并且我一直在圈子里奔波。我发现很多有关将本地时间转换为UTC的信息,这很基本(也许我也做错了),但是我找不到任何有关将UTC时间轻松转换为最终用户时区的信息。 简而言之,android应用程序向我发送了(appengine应用程序)数据,该数据中包含时间戳。要将时间戳存储为UTC时间,我正在使用: 那似乎行得通。当我的应

  • 问题内容: 将日期转换为JSON时,javascript会以以下格式保存日期: 但是,我不确定如何将其放入python datetime对象。我已经尝试过这些: 我相信javascript会将字符串保存为官方ISO格式,因此似乎应该有一种方法可以让python 读取它? 问题答案: 请尝试以下格式: 例如: 该的日期只是手段,它应该被解释为UTC时间,所以忽略它不会造成任何信息丢失。您可以在这里找

  • 问题内容: 我试图将字符串转换为日期时间对象。我从新闻提要中获取的字符串格式如下:“星期四,2014年10月16日美国东部时间01:16:17” 我尝试使用datetime.strptime()进行转换。即 并得到以下错误: 追溯(最近一次通话最近): 文件“”,第1行,位于datetime.strptime(’Thu,16 Oct 2014 01:16:17 EDT’,’%a,%d%b%Y%H: