【问题标题】:Exception in parsing date format [duplicate]解析日期格式的异常[重复]
【发布时间】:2013-06-03 08:49:48
【问题描述】:

我有一个如下格式的日期

//输入日期

Thu Jun 06 2013 00:00:00 GMT+0530 (India Standard Time)

//输出日期格式

I want to change this to "dd-mm-yyyy, hh:mm:ss".

我从 db 获取输入日期格式。我必须将其更改为输出日期格式,我将在网格中显示它。

我尝试了以下代码。

DateFormat outputDate = new SimpleDateFormat("dd-mm-yyyy, hh:mm:ss"); 
                try
                {
                    Date date = outputDate.parse(facade.getDate.toString()); **//getting exception here**
                    outputDate = new SimpleDateFormat("dd-mm-yyyy, hh:mm:ss");
                    Date date1 = new SimpleDateFormat("dd-mm-yyyy, hh:mm:ss").parse(outputDate
                            .format(date));
                    facade.setDate(date1);
                }catch (ParseException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

我来了

java.text.ParseException: Unparseable date: "2013-06-06 00:00:00.0".

任何帮助..

【问题讨论】:

  • 你在哪一行得到错误?
  • 在这一行 Date date = outputDate.parse(facade.getDate.toString());
  • 一方面,你想要 `dd-MM-yyyy, HH:mm:ss" 作为输出格式。阅读 SimpleDateFormat 的文档。但是你到处都有相同的格式 - 你从不指定您的 input 格式。您的输入字符串中的确切内容尚不完全清楚。它实际上是否包含文本“(印度标准时间)”?如果是这样,您很可能需要删除首先。
  • 哦,你还需要考虑你想在哪个时区输出结果。
  • 听起来您目前只是在尝试任意数量的事情,而没有真正从逻辑上考虑。退后一步,重新开始。阅读 SimpleDateFormat 的文档。算出你的输入格式和输出格式。

标签: java date


【解决方案1】:
@Test
public void test() throws ParseException {
    SimpleDateFormat sdf_org = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.ENGLISH);
    Date d = sdf_org.parse("Thu Jun 06 2013 00:00:00 GMT+0530");
    SimpleDateFormat sdf_target = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSS");

    System.out.println(sdf_target.format(d));
}

输出控制台:2013-30-06 03:30:00.000

【讨论】:

  • 转换回日期??
【解决方案2】:

下面是一些适合我的代码:

import java.text.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String input = "Thu Jun 06 2013 00:00:00 GMT+0530 (India Standard Time)";
        DateFormat inputFormat = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss 'GMT'z",
                                                      Locale.ENGLISH);
        Date date = inputFormat.parse(input);

        DateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss",
                                                       Locale.ENGLISH);
        outputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        String output = outputFormat.format(date);
        System.out.println(output);
    }
}

需要考虑的事项:

  • 您需要计算出您的输出时区。目前我已将其设置为 UTC,但这可能不是您想要的。
  • 您确实需要退后一步,仔细考虑。您显然有两种不同的格式 - 您正在尝试从一种转换为另一种。因此,创建三个不同的 SimpleDateFormat 对象都具有 same 格式永远不会奏效。
  • 您需要仔细阅读文档...SimpleDateFormatM 表示月份,m 表示分钟; h 使用 12 小时制,H 使用 24 小时制。

这是假设您实际上 需要 以字符串开头。如果getDate 已经是DateTimestamp,则可以忽略第一部分——只需使用上述代码的输出部分即可。您应该尽可能避免不必要的字符串转换。

请注意,dd-MM-yyyy 是一种略微不寻常的格式 - 您确定您实际上并不想要更常见(且可排序)的 yyyy-MM-dd

【讨论】:

  • 我想再次将字符串转换为日期格式!!!你能帮忙吗?
  • @sahana:你为什么需要这样做?尽量避免字符串转换。如果您真的需要这样做,只需使用相同的SimpleDateFormat,但调用parse 而不是format
【解决方案3】:

故障在这里

DateFormat outputDate = new SimpleDateFormat("dd-mm-yyyy, hh:mm:ss"); 

模式应该等于Thu Jun 06 2013 00:00:00 GMT+0530 (India Standard Time)。不是你的输出字符串模式。

【讨论】:

    【解决方案4】:
    DateFormat outputDate = new SimpleDateFormat("yyyy-dd-mm hh:mm:ss");
    try {
        Date date = outputDate.parse("2013-06-06 00:00:00.0");
        System.out.println(new SimpleDateFormat("dd-mm-yyyy, hh:mm:ss").format(date));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    运行良好,第 1 行不正确。您的 SimpleDateFormat.parse 需要采用输入日期的确切格式。然后你想以不同的格式输出它,所以你制作另一种格式并设置格式,然后调用 SimpleDateFormat.format(date) 并在其上放一个 println。

    【讨论】:

      【解决方案5】:

      "2013-06-06 00:00:00.0""dd-mm-yyyy, hh:mm:ss" 不匹配,您的格式应改为 "dd-MM-yyyy hh:mm:ss"

      但是,看看你的代码,我猜facade.getDate 实际上是一个java.sql.Timestamp,它继承自java.util.Date,所以你可以直接将它传递给这样的格式

      new SimpleDateFormat("dd-MM-yyyy, hh:mm:ss").format(facade.getDate)
      

      【讨论】:

      • 这不是 OP 真正想要的格式 - 它将使用 12 小时制,分钟而不是月。
      • @JonSkeet 感谢您指出这一点……我不适合复制粘贴
      • OP 也应该考虑语言环境和时区。
      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2016-02-24
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多