我到处寻找,但我找不到任何关于在android中解析日期时间json对象的事情。
我正在尝试将此JSON 2016-08-12T20:07:59.518451
转换为仅时间20:07
,并将其格式化为正确的时区UTC / GMT +1小时。
我可以在javascript中完成,但我无法在Java / Android中正确使用它。
是否有一种方法可以为我处理此问题,还是需要使用正则表达式来获取正确的时间?
编辑:这是代码。 expectedArrival是json日期/时间的一个,我只想得到UTC / GMT +1小时时区的时间。
public class JSONTaskArrivals extends AsyncTask<String, String,List<ArrivalItem>> {
@Override
protected List<ArrivalItem> doInBackground(String... params) {
//json
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while((line = reader.readLine()) != null){
buffer.append(line);
}
String finalJSON = buffer.toString();
JSONArray parentArray = new JSONArray(finalJSON);
List<ArrivalItem> arrivalItems = new ArrayList<>();
int time = 0;
for (int i = 0; i < parentArray.length(); i++){
JSONObject finalObject = parentArray.getJSONObject(i);
ArrivalItem item = new ArrivalItem();
item.setDestination(finalObject.getString("destinationName"));
item.setEstimated(finalObject.getString("expectedArrival"));
time = finalObject.getInt("timeToStation")/60;
if(time < 1){
item.setLive("Due");
}else{
item.setLive(Integer.toString(time)+" mins");
}
arrivalItems.add(item);
}
return arrivalItems;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} finally {
if (connection != null){
connection.disconnect();
}
try {
if (reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(List<ArrivalItem> result) {
super.onPostExecute(result);
ArrivalsAdapter adapter = new ArrivalsAdapter(ArrivalsActivity.this, R.layout.arrivals_row, result);
lv = (ListView) findViewById(R.id.arrivals_listView);
lv.setAdapter(adapter);
}
}
答案 0 :(得分:3)
没有“JSON日期时间”。 JSON定义了very few data types。
如果输入字符串2016-08-12T20:07:59.518451
表示UTC时刻,请附加Z
(Zulu的缩写,表示UTC)。
String input = "2016-08-12T20:07:59.518451" + "Z" ;
然后解析为Instant
。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。因此,使用microseconds的示例输入非常适合。
Instant instant = Instant.parse( input );
根据UTC调整所需的偏移量。
ZoneOffset offset = ZoneOffset.ofHours( 1 ); // One hour ahead UTC.
申请获得OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( offset );
如果您只希望OffsetDateTime
提取LocalTime
的时间。
LocalTime lt = odt.toLocalTime(); // Example: 20:39
如果您需要toString
方法使用的ISO 8601格式以外的其他格式,请使用DateTimeFormatter
对象。如果您在Stack Overflow上搜索,可以找到许多示例。
最好使用时区(如果已知),而不仅仅是偏移量。生成ZonedDateTime
对象。
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = instant.atZone( zoneId );
LocalTime lt = zdt.toLocalTime();
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。
答案 1 :(得分:2)
你应该这样做:
答案 2 :(得分:0)
您可以使用split方法分割日期和时间,并将其另外存储为两个变量.. 所以现在你有了日期和时间的分离值。