SimpleDateFormat.parse失败

时间:2017-08-31 06:17:16

标签: java android simpledateformat

我是Android和Java的新手。

我正在尝试将值为“1986-10-02”的字符串转换为Integer,以便将其保存到数据库中。该日期所需的整数值为528595200。

我已经关注了大量的SO示例,但我无法构建它。任何建议高度赞赏!这是我的代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
Date d = sdf.parse("1986-10-02");
Long DateAsInteger = d.getTime()*1000L;
Integer iDOB = DateAsInteger.intValue();

所需的Integer(528595200)是Unix时间戳。在我的代码的另一部分,当我从数据库中检索该整数并将其转换为日期时,它正常工作并生成一个字符串=“02-10-1986”。

Date date = new Date(cursor.getInt(4)*1000L); // *1000 is to convert seconds to milliseconds
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); // the format of your date
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
String formattedDate = sdf.format(date);

4 个答案:

答案 0 :(得分:2)

我想提供现代答案。这不是你要求的答案,但我希望这是你想要的答案。

ThreeTenABP

SimpleDateFormatDate已过时。我可以理解为什么你仍然试图在Android上使用它们,因为Android Java 7没有更好的内置功能。但是,这是您学习使用外部库的好时机。我建议你使用ThreeTenABP,它为你提供了现代的Java日期和时间API,它比过时的类更好用。

关于如何在项目中包含该库,this question: How to use ThreeTenABP in Android Project中有一个很好的解释。

然后代码可以是:

    long unixTimestamp = LocalDate.parse("1986-10-02")
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .getEpochSecond();
    int intValue;
    if (unixTimestamp <= Integer.MAX_VALUE) {
        intValue = (int) unixTimestamp;
        System.out.println(intValue);
    } else {
        System.out.println("int overflow; cannot represent " + unixTimestamp + " in an int");
    }

打印:

528595200

这是您要求的价值。似乎没有必要使用您在问题中尝试过的GMT + 10时区(我尝试过,并得到了错误的结果)。

int

中的Unix时间戳

Unix时间戳可以用32位int表示,直到2038年1月的某个时间,之后你会遇到一种“2000年问题”。所以我想我们也可能习惯使用64-bit long代替。

出了什么问题?

对于您问题中的代码,您可能会遇到一些问题(除了使用过时的类):

  1. 编译器要求您考虑ParseException的可能性,方法是声明您的方法可能会抛出它,或者使用try / catch构造包围您的代码。阅读Java中的异常处理以了解更多信息,它在很多地方都有描述。
  2. 您乘以1000L而不是除以它,从而溢出了您尝试将结果存储到Integer之后。
  3. 最后,正如我所说,你应该使用TimeZone.getTimeZone("GMT")而不是+10

答案 1 :(得分:1)

试试这个

 try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));
        Date d = sdf.parse("1986-10-02");
        Log.e("Int Date : ",  d.getTime()/1000+"");// covert date in to int
        Log.e("Int Date : ",""+ new Date(((long)d.getTime()/1000)*1000L));/ covert date in to Long
     } catch (ParseException e) {
        e.printStackTrace();
 }

答案 2 :(得分:1)

试试这个家伙:

String sDate="31/12/1998";
Date myDate = new Date();
try {
    myDate=new SimpleDateFormat("dd/MM/yyyy").parse(sDate);
} catch (ParseException e) {
    e.printStackTrace();
}
Integer res = (int) myDate.getTime();

可能是你的问题是因为试试了

答案 3 :(得分:0)

非常感谢大家的帮助。我按照你的建议使用Long而不是Int,并且还使用了try / catch。我设法让它与下面的工作:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+10"));

try {
         Date d = sdf.parse("1986-10-02");
         Long DateAsInteger = d.getTime()/1000;

     } catch (Exception e) { 

         // this is where you handle it if an error occurs
     }