将已知时区的日期转换为 UTC 日期

Convert date with known timezone to UTC date

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

  1. String date="2015-08-21 03:15" 此日期的时区是
  2. 字符串时区="GMT+05:30";

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

您可以看到:

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

你可以这样试试:

Approach 1: Using 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));

Approach 2: Using Joda time (recommended)

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

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

的原因

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

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

所以要将 Date 转换为 UTC 时区中的特定时间:

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

如果在 "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);

因为您只想要 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