使用 java 将当前 GMT 时间转换为 CST 时区
Convert current GMT time into CST timezone using java
我正在尝试使用 JDK8 将当前 GMT 时间转换为 CST 时间。但是对于两个时区,我的代码总是 returns 同时。我还验证了 getAvailableIDs() 有 "CST".
Calendar cal = Calendar.getInstance();
TimeZone timeZone = TimeZone.getTimeZone("GMT");
cal.setTimeZone(timeZone);
// System.out.println("GMT time = " + cal.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
String gmtDateStr = sdf.format(cal.getTime());
System.out.println("Formatted GMT time = " + gmtDateStr);
// To CST
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone cst = TimeZone.getTimeZone("CST");
sdf2.setTimeZone(cst);
Date cstDate = sdf2.parse(gmtDateStr);
// System.out.println("PARSED CST DATE = " + cstDate);
Calendar cal2 = new GregorianCalendar();
cal2.setTime(cstDate);
cal2.setTimeZone(cst);
String cstDateStr = sdf2.format(cal2.getTime());
// System.out.println("cal2 time = " + cal2.getTime());
System.out.println("FORMATTED CST DATE = " + cstDateStr);
这里有什么问题?谁能给我一个答案?
您无需进行所有这些转换即可获得您首选时区的时间。您可以简单地执行以下操作..
Calendar cal = Calendar.getInstance();
TimeZone timeZone = TimeZone.getTimeZone("GMT");
cal.setTimeZone(timeZone);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
String gmtDateStr = sdf.format(cal.getTime());
System.out.println("Formatted GMT time = " + gmtDateStr);
// To CST
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone cst = TimeZone.getTimeZone("CST");
sdf2.setTimeZone(cst);
System.out.println("FORMATTED CST DATE = " + sdf2.format(cal.getTime()));
您的代码的问题在于对 Calendar.getTime()
的所有调用。这个returns一个Date
实例,那些对象没有时区的概念。因此在 Calendar
实例中设置时区是没有用的,因为在转换为 Date
.
时您会丢弃该信息
只需在格式化程序中指定时区,就像 Yogesh Badke 的回答一样。
Java 8 java.time
未找到由 CST
标识的区域
ZoneId cst = ZoneId.of("CST");
结果为 java.time.zone.ZoneRulesException: Unknown time-zone ID: CST
。这是有道理的,因为北美有中央标准时间、中国标准时间,可能还有其他时间。
如果您指的是 America/Chicago
代表的北美中部标准时间:
ZoneId gmt = ZoneId.of("GMT");
ZoneId cst = ZoneId.of("America/Chicago");
ZonedDateTime gmtTime = ZonedDateTime.now(gmt);
ZonedDateTime cstTime = gmtTime.withZoneSameInstant(cst);
我正在尝试使用 JDK8 将当前 GMT 时间转换为 CST 时间。但是对于两个时区,我的代码总是 returns 同时。我还验证了 getAvailableIDs() 有 "CST".
Calendar cal = Calendar.getInstance();
TimeZone timeZone = TimeZone.getTimeZone("GMT");
cal.setTimeZone(timeZone);
// System.out.println("GMT time = " + cal.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
String gmtDateStr = sdf.format(cal.getTime());
System.out.println("Formatted GMT time = " + gmtDateStr);
// To CST
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone cst = TimeZone.getTimeZone("CST");
sdf2.setTimeZone(cst);
Date cstDate = sdf2.parse(gmtDateStr);
// System.out.println("PARSED CST DATE = " + cstDate);
Calendar cal2 = new GregorianCalendar();
cal2.setTime(cstDate);
cal2.setTimeZone(cst);
String cstDateStr = sdf2.format(cal2.getTime());
// System.out.println("cal2 time = " + cal2.getTime());
System.out.println("FORMATTED CST DATE = " + cstDateStr);
这里有什么问题?谁能给我一个答案?
您无需进行所有这些转换即可获得您首选时区的时间。您可以简单地执行以下操作..
Calendar cal = Calendar.getInstance();
TimeZone timeZone = TimeZone.getTimeZone("GMT");
cal.setTimeZone(timeZone);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
String gmtDateStr = sdf.format(cal.getTime());
System.out.println("Formatted GMT time = " + gmtDateStr);
// To CST
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone cst = TimeZone.getTimeZone("CST");
sdf2.setTimeZone(cst);
System.out.println("FORMATTED CST DATE = " + sdf2.format(cal.getTime()));
您的代码的问题在于对 Calendar.getTime()
的所有调用。这个returns一个Date
实例,那些对象没有时区的概念。因此在 Calendar
实例中设置时区是没有用的,因为在转换为 Date
.
只需在格式化程序中指定时区,就像 Yogesh Badke 的回答一样。
Java 8 java.time
未找到由 CST
ZoneId cst = ZoneId.of("CST");
结果为 java.time.zone.ZoneRulesException: Unknown time-zone ID: CST
。这是有道理的,因为北美有中央标准时间、中国标准时间,可能还有其他时间。
如果您指的是 America/Chicago
代表的北美中部标准时间:
ZoneId gmt = ZoneId.of("GMT");
ZoneId cst = ZoneId.of("America/Chicago");
ZonedDateTime gmtTime = ZonedDateTime.now(gmt);
ZonedDateTime cstTime = gmtTime.withZoneSameInstant(cst);