java.text.ParseException:在java中将时间戳值转换为时间时出现不可解析的日期异常

问题描述 投票:0回答:4

我想将作为字符串传递给 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;
}

请指导我实现我错过的逻辑。预先感谢。

java timestamp deprecated simpledateformat
4个回答
3
投票

如果格式字符串是这样的,则对答案进行补充

"EEE MMM dd HH:mm:ss z yyyy"

那么你的输入字符串应该是

"Thu Jan 1 17:45:00 +0530 1970"

请注意,“UTC”被跳过,因为它隐式指的是 RFC 822 时区


2
投票

首先,你的第二个

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

1
投票

您输入

dateformat
需要是

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zZ yyyy", Locale.US);

其他格式完全取决于您,根据您的要求。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。

使用现代日期时间 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 的更多信息。

有用的链接始终为自定义格式指定带有日期时间格式化程序的区域设置

© www.soinside.com 2019 - 2024. All rights reserved.