【问题标题】:Converting JSON object to util.Date in Java在 Java 中将 JSON 对象转换为 util.Date
【发布时间】:2019-02-17 02:56:17
【问题描述】:

我有一个看起来像这样的对象:

{
    "date": 12,
    "day": 3,
    "hours": 12,
    "minutes": 32,
    "month": 8,
    "seconds": 32,
    "time": 1536755552909,
    "timezoneOffset": 0,
    "year": 118
}

我之前使用util.Date 生成日期,但现在我从 Node.js 服务器以上述格式获取它。如何将其转换为 Date 类型?

当我尝试做的时候

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            JsonParser jsonParser = new JsonParser();
            JsonElement jsonElement = jsonParser.parse(response);
            Gson gson = new Gson();
            Date date = gson.fromJson(jsonElement,Date.class);

            lastLoadedDate = date;

            elapsedTime = 0;

        }
    }

这只是失败,因为它不是一个字符串,节点服务器发送一个 JSON。如果我这样做 new Response.Listener&lt;Date&gt;() 因为它是 JSON,而不是日期。像这样Date now = (Date) myJsonResponse 将 JSON 转换为 Date 会导致 Android Studio 出错:

无可争议的类型:无法将 JSONObject 转换为 Date

编辑。我不能使用 util.Date,因为我需要从服务器来的时间,以便对每个人都通用。

【问题讨论】:

  • 我认为time 字段代表的是 Epoch 中的时间,您不能将其转换为日期吗?
  • 如果您想获取日期,可以使用 json 来获取日期 - 您可以尝试使用字符串格式,例如“Sep 12, 2018 3:57:59 PM”
  • @AyushGupta 这就是解决它的方法。要添加答案吗?
  • @AlexIronside 自从我使用 JAVA 以来已经有一段时间了,所以我对语法不够精通,无法给出可接受的答案

标签: java android json date time


【解决方案1】:

如果可能,让服务器以更好的格式返回日期,例如ISO-8601,因为这样可以避免歧义并导致更小的 JSON 负载。

如果不可能,您将不得不决定使用 JSON 的哪些部分,time 或 hours、minutes 等不同的值...通过手动挑选这些部分,您可以使用其构造函数之一或通过java.util.Calendar 对象手动构建Date 对象(因为java.util.Date 中的许多构造函数在Java 8 中已被弃用)。

【讨论】:

  • time 字段可能需要乘以 1000 才能在 Android 中工作。
  • 可能是正确的,并且还取决于月份是零还是 1,以正确解释它。这就是为什么我总是坚持使用 ISO-8601 来避免所有这些问题。
  • 好吧,只要插入 time 字段就可以让 Date 解决其他所有问题。
  • 仅当您不考虑时区时。
  • Date 在其构造函数之一中没有 Locale 参数吗?还是那个日历?
【解决方案2】:

这就是解决它的方法。感谢 Ayush Gupta 的评论。

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            try {

                JSONObject jsonObject = new JSONObject(response);

                timestamp = jsonObject.getLong("time");

                lastLoadedDate = new Date(timestamp);

            } catch (JSONException e) {
                //Handle the exception
            }

        }
    }

【讨论】:

    【解决方案3】:

    如果你想使用java的util.Date,你可以自己生成。

    在documentation 中,您可以找到正确的构造函数声明为Date(int year, int month, int date, int hrs, int min, int sec)。

    所以你可以从 json 中创建它,你只需要从中获取正确的值(以指定 json 对象的方式->在我的示例中它是一个对象):

    Date date = new Date(jsonElement.get(year), jsonElement.get(month), jsonElement.get(date), jsonElement.get(hrs), jsonElement.get(min), jsonElement.get(sec));
    

    【讨论】:

      【解决方案4】:

      首先,像这样创建一个 POJO 类。

          public class ResponseModel {
      
          private int date;
          private int day;
          private int hours;
          private int minutes;
          private int month;
          private int seconds;
          private long time;
          private int timezoneOffset;
          private int year;
      
          public int getDate() {
              return date;
          }
      
          public ResponseModel setDate(int date) {
              this.date = date;
              return this;
          }
      
          public int getDay() {
              return day;
          }
      
          public ResponseModel setDay(int day) {
              this.day = day;
              return this;
          }
      
          public int getHours() {
              return hours;
          }
      
          public ResponseModel setHours(int hours) {
              this.hours = hours;
              return this;
          }
      
          public int getMinutes() {
              return minutes;
          }
      
          public ResponseModel setMinutes(int minutes) {
              this.minutes = minutes;
              return this;
          }
      
          public int getMonth() {
              return month;
          }
      
          public ResponseModel setMonth(int month) {
              this.month = month;
              return this;
          }
      
          public int getSeconds() {
              return seconds;
          }
      
          public ResponseModel setSeconds(int seconds) {
              this.seconds = seconds;
              return this;
          }
      
          public long getTime() {
              return time;
          }
      
          public ResponseModel setTime(long time) {
              this.time = time;
              return this;
          }
      
          public int getTimezoneOffset() {
              return timezoneOffset;
          }
      
          public ResponseModel setTimezoneOffset(int timezoneOffset) {
              this.timezoneOffset = timezoneOffset;
              return this;
          }
      
          public int getYear() {
              return year;
          }
      
          public ResponseModel setYear(int year) {
              this.year = year;
              return this;
          }
      }
      

      然后像这样将您的字符串响应转换为ResponseModel.class

      Gson gson = new Gson();
      ResponseModel model = gson.fromJson(jsonElement,ResponseModel.class);
      

      然后创建一个类似下面的方法

      private Date getDateFromResponse(ResponseModel model) {
              Calendar calendar = Calendar.getInstance();
      
              //-----
              calendar.set(Calendar.DAY_OF_MONTH, model.getDate());
              calendar.set(Calendar.MONTH, model.getMonth());
              calendar.set(Calendar.YEAR, model.getYear());
              calendar.set(Calendar.HOUR, model.getHours());
              calendar.set(Calendar.MINUTE, model.getMinutes());
              calendar.set(Calendar.SECOND, model.getSeconds());
      
              //OR
              //You can simply add this line with this time is equal to your all fields
              //And comment all above lines.
              //calendar.setTimeInMillis(model.getTime());
      
              return calendar.getTime();
      
          }
      

      然后简单地调用这个方法。

      Date date = getDateFromResponse(model);
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-08-29
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多