【问题标题】:parsing Unix time to java on android在android上将Unix时间解析为java
【发布时间】:2013-12-27 05:59:30
【问题描述】:

美好的一天。我正在开发一个小应用程序,目前我正在尝试从 JSON 对象(在 CouchDB 上)解析 Unix 时间。我尝试了几种方法,但我认为这是最接近的一种。现在我得到 NumberFormatException: Invalid long: "Time" 错误

private Points parseJsonDocument(JSONObject json) throws JSONException, ParseException
{

    String openKey = JSON_MAP.get(MAP_OPEN);
    String closeKey = JSON_MAP.get(MAP_CLOSE);
    String highKey = JSON_MAP.get(MAP_HIGH);
    String lowKey = JSON_MAP.get(MAP_LOW);
    String volumeKey = JSON_MAP.get(MAP_VOLUME);
    String dateKey = JSON_MAP.get(MAP_DATE);


    JSONObject object = json.getJSONObject("Stock");
    JSONArray array = object.getJSONArray("Data");
//  JSONArray array = json.getJSONArray("Data");
    Points result = new Points();


    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //desired format

    Long time = Long.parseLong(dateKey);
    final Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time *1000);



    for(int i=0;i<array.length();i++)
    {
        JSONObject obj = array.getJSONObject(i);

        Point cp = new Point();
        cp.c = obj.getDouble(closeKey);
        cp.h = obj.getDouble(highKey);
        cp.l = obj.getDouble(lowKey);
        cp.o = obj.getDouble(openKey);
        cp.v = obj.getDouble(volumeKey);

        String date = obj.getString(dateKey);
        cp.dt = df.parse(df.format(cal.getTime()));

        result.add(cp);
    }

    return result;
}

JSON 对象如下所示:

     {
   "_id": "abbv",
   "_rev": "12-3d250de8395a12e0c92dfb9d7d379fc4",
    "Stock": {
       "Data": [
       {
           "Time": "1386598949000",
           "Open": "50.17",
           "High": "0",
           "Low": "0",
           "Close": "51.37",
           "Volume": "7285755"
       }
]
}

这可能是一些愚蠢的错误,由于缺乏经验,我只是看不到,所以任何建议或指导将不胜感激。是的,我尝试阅读 javadocs,但找不到解决方案。 谢谢。

【问题讨论】:

  • 什么是 JSON_MAP?看起来您可能正在尝试解析 JSON 键,而不是值(请参见 Long time = Long.parseLong(dateKey); 行)
  • 这是一个 hashMap,这是我声明它们的原因:static { JSON_MAP = new HashMap(); JSON_MAP.put(MAP_OPEN, "打开"); //剩下的 JSON_MAP.put(MAP_DATE, "Time"); }
  • 好吧,无论哪种方式 dateKey 总是会保持值 "Time" 然后,我相信这是你的问题,你试图将 "Time" 解析为 Long :)
  • 我想我不能以漂亮的方式在 cmets 中格式化它
  • @panini 但它很长,不是吗? :)

标签: java android json parsing time


【解决方案1】:

Long time = Long.parseLong(dateKey);

正在尝试将String 时间 解析为Long。 我想你想做的是这个

String timeString = array.getJSONObject(0).getString(dateKey);
Long time = Long.parseLong(timeString)

编辑:重新阅读您的代码,我认为问题是您试图过早地解析您的日期。

您需要将行 Long time = Long.parseLong(dateKey); 向下移动到您的 JSON 解析循环中。

那么,你应该解析日期value而不是日期key,而不是Long time = Long.parseLong(dateKey);,所以Long.parseLong(date);

【讨论】:

  • 它告诉我将广告投射到 'array' ,但是我不确定我在这里放什么而不是 'Object': String timeString = ((Object) array).getObjectAt(0 ).getString(dateKey);
  • @Emily 抱歉,我误读了这个问题。我在这里更新了我的答案,或者您可以查看 Adam S 的答案,其中详细介绍了类似的方法
  • 我认为现在它会获取文档中的所有日期值并将它们汇总,然后显示它们。因为当我尝试 uotprint 日期日期然后解析日期时,这就是我得到的:解析日期“Thu Jul 29 00:43:20 CEST 45909”和原始日期:“333333333332111111111111386598949000”
【解决方案2】:

您可以创建一个新的Date 对象,或一个新的DateTime 对象(来自JodaTime - Java 中操作日期的推荐方法),其构造函数需要很长时间/Unix 时间以毫秒为单位

long time;
// ...
Date date = new Date(time);
DateTime jodaDate = new DateTime(time);

查看您的代码,您可以完全删除您的解析代码。删除这些行:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //desired format

Long time = Long.parseLong(dateKey);
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time *1000);

并在循环中替换这些以解析 JSON 'Data' 对象:

String date = obj.getString(dateKey);
cp.dt = new Date(Long.parseLong(date));

result.add(cp);

您的“所需格式”是输出格式。您可以通过这种方式格式化日期输出字符串:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //desired format
String formattedDate = df.format(date);

【讨论】:

  • 感谢亚当的回复。我不得不承认我无法实现你所说的,但是它看起来非常接近我从一开始就拥有的东西。事情是我不确定 DateTime jodaDate = new DateTime(time);我必须为此创建一个类吗?和“期望的循环”代码,我把它放在for循环中吗?谢谢
  • 是的,在您的for 循环结束时,您有一些类似的代码 - 您只需将其替换为我提供的示例内容。不用担心 DateTime 对象 - 它是我在上面链接的 Joda Time 库的一部分。如果您所做的只是将其从 Unix 时间戳解析为 Date 对象,然后显示它,那么您就不需要更多了。如果您需要操作日期(添加天数、比较天数等),那么我建议您查看 JodaTime 库以寻求帮助,因为它可以处理您会遇到的许多问题。
猜你喜欢
  • 1970-01-01
  • 2017-02-20
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2014-06-22
相关资源
最近更新 更多