我有一个看起来像这样的对象:
{
"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;
}
}
这只是失败,因为它不是字符串,Node服务器发送JSON。如果我做new Response.Listener<Date>()
是因为它是JSON,而不是日期。将Date now = (Date) myJsonResponse
这样的JSON转换为Date会导致Android Studio错误提示:
不可逆类型:无法将JSONObject强制转换为Date
编辑。我不能使用util.Date,因为我需要时间从服务器来,这对每个人来说都是通用的。
答案 0 :(得分:2)
如果可能,请让服务器以更好的格式(例如ISO-8601)返回日期,因为这样可以避免歧义,并减小JSON负载。
如果无法实现,则必须决定使用JSON的哪些部分,time
或hours
,minutes
等不同的值,...手动挑选这些部分,您可以使用其构造函数之一或通过Date
对象手动构建java.util.Calendar
对象(因为Java 8中已弃用java.util.Date
中的许多构造函数)。
答案 1 :(得分:1)
这是解决问题的方法。谢谢Ayush Gupta的评论。
variant
答案 2 :(得分:0)
如果要使用Java的util.Date,则可以自己生成它。
在documentation中,您可以找到正确的构造方法声明为Date(int year, int month, int date, int hrs, int min, int sec)
。
因此您可以从json创建它,只需从中获取适当的值(以指定json对象的方式->在我的示例中,它是一个Object):
Date date = new Date(jsonElement.get(year), jsonElement.get(month), jsonElement.get(date), jsonElement.get(hrs), jsonElement.get(min), jsonElement.get(sec));
答案 3 :(得分:0)
首先,您创建一个像这样的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);
希望这对您有所帮助。