我的日期格式为(例如)日期= 2023 - 01 - 09T23:51:44.595Z,我的utcOffset字符串utcOffset ="UTC +6"
我希望以日期格式输出为2023 - 01 - 10T05:51:44.595Z。
如何做到这一点??
我应该将UTC偏移添加到现有日期。
尝试了以下操作:
public static void main(String[] args) throws ParseException {
String rawDate = "2023-01-09T23:51:44.595Z";
String utcOffset = "UTC +6";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
Date date = (Date) formatter.parse(rawDate);
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
String v = formatter1.format(date);
System.out.println("Original raw date::::::::::"+v);
System.out.println("utcOffset::::::::::"+utcOffset);
Date triggerTime = date;
String onlyHoursAndMin = StringUtils.strip(utcOffset, "UTC ");
String[] split = onlyHoursAndMin.split(":");
int hours = Integer.parseInt("0");
int minutes = Integer.parseInt("0");
if (split.length == 2) {
hours = Integer.parseInt(split[0]);
minutes = Integer.parseInt(split[1]);
} else if (split.length == 1) {
hours = Integer.parseInt(split[0]);
minutes = Integer.parseInt("0");
}
TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
calendar.setTime(triggerTime);
calendar.add(Calendar.HOUR_OF_DAY, hours);
calendar.add(Calendar.MINUTE, minutes);
Date s = calendar.getTime();
SimpleDateFormat utcFormatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
String newDate = utcFormatter1.format(s);
System.out.println("Date in string format::::::::::::::"+newDate);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
Date aaa = format1.parse(newDate);
String bbb = format2.format(aaa);
System.out.println(":::::::::::::"+aaa);
System.out.println("Date in correct format::::::::::::::"+format2.format(aaa));
}
但结局日期格式为2023年1月10日星期二05:51:44 IST,这不是预期的。
当构建时,我也得到以下错误:禁止的方法调用:java. util. Calendar #getInstance(java. util. TimeZone)[使用默认区域设置或时区]
2条答案
按热度按时间qni6mghb1#
我建议不要使用传统的API(java.util.Date,java.util.Calendar等),因为它既麻烦又容易出错。自从java8以来,现代的日期-时间API java.time就可用了。有了它,任务将变得相当琐碎。
打印时间-
2023-01-10T05:51:44.595+06:00
。请注意,它以
+06:00
结尾,而不是以Z
结尾。日期时间字符串结尾的Z
表示Zulu
,这表示时间采用UTC -What is the Z ending on date strings like 2014-01-01T00:00:00.588Z。由于结果时间是UTC + 6小时,因此日期字符串2023-01-10T05:51:44.595Z
将是不正确的。3okqufwl2#
Java.时间
java.util
日期-时间API及其对应的解析/格式化类型SimpleDateFormat
已经过时且容易出错。2014年3月,modern Date-Time API作为Java 8标准库的一部分发布,取代了传统的日期-时间API,从那时起,强烈建议切换到java.time
,现代的日期-时间API。使用
java.time
的解决方案java.time
API基于ISO 8601,因此您不需要DateTimeFormatter
来解析已经采用ISO 8601格式的日期-时间字符串,例如您的日期-时间字符串2023-01-09T23:51:44.595Z
可以直接解析为OffsetDateTime
。1.您的偏移字符串不是ISO 8601标准格式。标准格式为
+/-HH:mm:ss
或Z
,表示+00:00
偏移。在大多数情况下,您将看到+/-HH:mm
,例如+06:00
。您可以选择任何基本的字符串操作技术来从字符串中获取小时和分钟,并使用它们创建一个ZoneOffset
示例。我用了一个我觉得很容易做的方法。代码的其余部分很简单。
请注意,如果没有am/pm标记,
2023-01-10T05:51:44.595Z
就没有意义,因为您指的是05:51:44.595 pm
。您可以使用DateTimeFormatter
以您想要的方式格式化上述输出。ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
我喜欢Ole V.V.建议的解析偏移字符串的替代方法。下面给出的是基于他的建议的解决方案:
ONLINE DEMO