我想将作为字符串传递给 SimpleDateFormat 对象的时间戳值转换为时间值,但它会引发无法解析的日期异常。
The Value which i am passing is Thu Jan 1 17:45:00 UTC+0530 1970
但是我遇到了如下异常:
java.text.ParseException: Unparseable date: "Thu Jan 1 17:45:00 UTC+0530 1970"
请找到我已实现的以下代码(不工作):
static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
static SimpleDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
static SimpleDateFormat outputFormatTime = new SimpleDateFormat("HH:mm:ss");
public static String convertUtcDateStringToTime(String utcDateValue) throws Exception
{
Date parsedDate = dateFormat.parse(utcDateValue);
String returnDate=outputFormatTime.format(inputFormat.parse(parsedDate.toString()));
return returnDate;
}
如果我使用下面的代码,它对我来说工作得很好(工作),但它是一个我想避免的已贬值的 Date 函数..
@SuppressWarnings("deprecation")
public static String convertUtcDateStringToTime(String utcDateValue) throws Exception
{
Date dateValue=new Date(utcDateValue);
Date parsedDate = dateFormat.parse(dateValue.toString());
String returnDate=outputFormatTime.format(inputFormat.parse(parsedDate.toString()));
return returnDate;
}
请指导我实现我错过的逻辑。预先感谢。
如果格式字符串是这样的,则对答案进行补充
"EEE MMM dd HH:mm:ss z yyyy"
那么你的输入字符串应该是
"Thu Jan 1 17:45:00 +0530 1970"
请注意,“UTC”被跳过,因为它隐式指的是 RFC 822 时区
首先,你的第二个
SimpleDateFormat
对象根本不需要。你正在做额外的工作,这是不需要的。所以,删除这个变量:
static SimpleDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US); // Not needed.
DateFormat#format(Date)
方法采用 Date
对象。您正在通过它String
。那是行不通的。这就是为什么你不需要上面的对象。无需再做一次inputFormat.parse(parsedDate.toString())
。
现在,解析当前字符串的格式应该是:
"EEE MMM dd HH:mm:ss 'UTC'z yyyy"
您需要在
UTC
之前将 z
用引号括起来。或者对于更一般的情况:
"EEE MMM dd HH:mm:ss zZ yyyy"
所以,你的代码应该是这样的:
static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zZ yyyy", Locale.US);
static SimpleDateFormat outputFormatTime = new SimpleDateFormat("HH:mm:ss");
public static String convertUtcDateStringToTime(String utcDateValue) throws Exception
{
Date parsedDate = dateFormat.parse(utcDateValue);
String returnDate=outputFormatTime.format(inputFormat);
return returnDate;
}
您输入
dateformat
需要是
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zZ yyyy", Locale.US);
其他格式完全取决于您,根据您的要求。
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的旧版java.util
日期时间 API。任何新代码都应使用 java.time
API。
使用具有适当模式的
OffsetDateTime
将日期时间字符串解析为 DateTimeFormatter
,例如DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss VVXX uuuu", Locale.ENGLISH)
。
您可以使用
LocalTime
获取其中的
ZonedDateTime#toLocalTime
部分。请注意,默认格式 LocalTime#toString
会删除秒和秒分数部分(如果它们为零);因此,如果您在输出字符串中需要它们,则必须使用 DateTimeFormatter
,例如DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH)
。
演示:
class Main {
private static final DateTimeFormatter parser = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss VVXX uuuu",
Locale.ENGLISH);
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH);
public static void main(String args[]) {
OffsetDateTime odt = OffsetDateTime.parse("Thu Jan 1 17:45:00 UTC+0530 1970", parser);
System.out.println(odt);
LocalTime time = odt.toLocalTime();
System.out.println(time);
// Formatting as desired
String formatted = time.format(formatter); // or odt.format(formatter)
System.out.println(formatted);
}
}
输出:
1970-01-01T17:45+05:30
17:45
17:45:00
从 Trail:日期时间了解有关现代日期时间 API 的更多信息。