我有一个像2013-10-22T01:37:56
这样的字符串。我需要将此字符串更改为UTC日期格式,如MM/dd/yyyy KK:mm:ss a
。我尝试了一些代码,但它没有返回UTC日期时间。
我的代码是
String[] time = itsAlarmDttm.split("T");
String aFormatDate = time[0]+ " "+time[1];
String aRevisedDate = null;
try {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final Date dateObj = sdf.parse(aFormatDate);
aRevisedDate = new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a").format(dateObj);
System.out.println(aRevisedDate);
} catch (ParseException e) {
itsLogger.error("Error occured in Parsing the Data Time Object: " +e.getMessage());
} catch (Exception e) {
itsLogger.error("Error occured in Data Time Objecct: " +e.getMessage());
}
我的输出格式为MM/dd/yyyy KK:mm:ss a
。但不是UTC时间格式。
如何解决这个问题?
答案 0 :(得分:17)
试试这个...为我工作并打印10/22/2013 01:37:56 AM
当然这只是你的代码,只需稍加修改。
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // This line converts the given date into UTC time zone
final java.util.Date dateObj = sdf.parse("2013-10-22T01:37:56");
aRevisedDate = new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a").format(dateObj);
System.out.println(aRevisedDate);
答案 1 :(得分:10)
尝试使用Z
或z
时区标记格式化日期:
new SimpleDateFormat("MM/dd/yyyy KK:mm:ss a Z").format(dateObj);
答案 2 :(得分:4)
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
// or SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy KK:mm:ss a Z" );
sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
System.out.println( sdf.format( new Date() ) );
答案 3 :(得分:4)
你的问题中没有提到time zone。输入字符串表示什么时区?您想要什么时区输出?并且,UTC是一个时区(或缺少时区,取决于您的心态)不是字符串格式。
您的输入字符串格式为ISO 8601,但缺少offset from UTC。
以下是Joda-Time 2.3中的一些示例代码,向您展示如何处理时区。 Joda-Time内置默认formatters,用于解析和生成日期时间值的字符串表示。
String input = "2013-10-22T01:37:56";
DateTime dateTimeUtc = new DateTime( input, DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" );
String output = dateTimeMontréal.toString();
至于以其他格式生成字符串表示,请搜索StackOverflow以获取" Joda格式"。
答案 4 :(得分:1)
现在该有人提供现代答案了。现代解决方案使用java.time(现代Java日期和时间API)。问题和其他几个答案中使用的SimpleDateFormat
和Date
类的设计很差,而且已经过时,特别是前者非常麻烦。 TimeZone
设计不当。我建议您避免这些。
ZoneId utc = ZoneId.of("Etc/UTC");
DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern(
"MM/dd/yyyy hh:mm:ss a zzz", Locale.ENGLISH);
String itsAlarmDttm = "2013-10-22T01:37:56";
ZonedDateTime utcDateTime = LocalDateTime.parse(itsAlarmDttm)
.atZone(ZoneId.systemDefault())
.withZoneSameInstant(utc);
String formatterUtcDateTime = utcDateTime.format(targetFormatter);
System.out.println(formatterUtcDateTime);
在我所在的时区,欧洲/哥本哈根运行时,输出为:
2013年10月21日下午11:37:56 UTC
我假设您获得的字符串位于JVM的默认时区中,这是一个脆弱的假设,因为可以随时从程序的另一部分或在同一JVM中运行的另一个程序更改默认设置。如果可以,请改为明确指定时区,例如ZoneId.of("Europe/Podgorica")
或ZoneId.of("Asia/Kolkata")
。
我正在利用您的字符串为ISO 8601格式这一事实,现代类将其解析为默认格式,即没有任何显式格式化程序。
我将ZonedDateTime
用于结果日期时间,因为它允许我们用格式化字符串中的UTC
对其进行格式化,以消除所有疑问。为了其他目的,通常会希望使用OffsetDateTime
或Instant
。