使用SimpleDateFormat格式化字符串解析异常?

时间:2018-06-27 18:10:14

标签: java date simpledateformat

我有一个日期对象,在执行date.toString()时返回以下字符串值

String date = "Wed Jun 27 12:33:00 CDT 2018";

我想完全按照这种样式进行格式化:

"June-27-2018 5:33:00 PM GMT".

我尝试使用SimpleDateFormat

protected SimpleDateFormat dateFormat = new SimpleDateFormat( "MMMM-dd-yyyy h:mm:ss a z", Locale.US);

但是我不断收到解析异常。有什么方法可以格式化吗?时区也需要转换。

3 个答案:

答案 0 :(得分:1)

首先,您不应该拥有utl_http.set_wallet('file:/etc/oracle/owm'); 对象。 Date类早已过时(无双关语)。今天,您应该更喜欢使用Date,这是现代且更好用的日期和时间API。但是,我假设您从某个无法更改的旧版API中获得了java.time。您应该做的第一件事就是将其转换为DateInstantInstant中的相应类。然后,您应该从那里进行任何进一步的操作。

java.time

此代码段可打印所需的内容:

  

2018年6月27日格林尼治标准时间下午5:33:00

直接从 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM-dd-yyyy h:mm:ss a z", Locale.US); ZoneId desireedZone = ZoneId.of("Etc/GMT"); Date yourOldfashionedDate = // …; ZonedDateTime dateTimeInGmt = yourOldfashionedDate.toInstant().atZone(desireedZone); String formattedDateTime = dateTimeInGmt.format(formatter); System.out.println(formattedDateTime); 对象进行转换比从其字符串表示形式进行转换更安全,更容易。后者的最大问题是字符串包含Date作为时区,这是不明确的。它可能代表澳大利亚中部夏令时,北美中部夏令时,古巴夏时制或查塔姆夏时制。您无法确定哪一个Java在给您。如果可以避免的话,切勿依赖三个字母和四个字母的时区缩写。

链接: Oracle tutorial: Date Time解释了如何使用CDT

答案 1 :(得分:0)

您的日期字符串无法解析为您提供的格式,因此请将格式更改为EEE MMM dd HH:mm:ss zzz yyyy

    String myDate = "Wed Jun 27 12:33:00 CDT 2018";
    SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
    SimpleDateFormat dateFormat_2 = new SimpleDateFormat("MMMM-dd-yyyy h:mm:ss a z", Locale.US);
    dateFormat_2.setTimeZone(TimeZone.getTimeZone("GMT"));

    Date d = dateFormat.parse(myDate);
    dateFormat_2.format(d);
    System.out.println(dateFormat_2.format(d));

输出:

June-27-2018 12:33:00 PM GMT

答案 2 :(得分:0)

如果将日期或对象传递给格式函数,则将实现所需的输出。

static func find(predicate:NSPredicate?, sortDescriptors:[NSSortDescriptor]?, in context: NSManagedObjectContext) throws -> [NSManagedObject] {

    // Create a request
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName:"MyEntity")

    // Apply predicate
    if let predicate = predicate {
        fetchRequest.predicate = predicate
    }

    // Apply sorting
    if let sortDescriptors = sortDescriptors {
        fetchRequest.sortDescriptors = sortDescriptors
    }

    // Run the fetchRequest
    return try context.fetch(fetchRequest)
}

在上面的代码SimpleDateFormat dateFormat = new SimpleDateFormat( "MMMM-dd-yyyy h:mm:ss a z", Locale.US); String ans=dateFormat.format(param); 中,必须是日期或对象,因此,首先将字符串转换为日期,然后应用格式函数以获取所需的输出。

请参见下面的示例代码

param

示例输出:

 SimpleDateFormat dateFormat = new SimpleDateFormat( "MMMM-dd-yyyy h:mm:ss a z", Locale.US);
 dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
 String ans=dateFormat.format(new Date());