Tôi nhận được ngày/giờ bằng json là 2011-10-26T20:29:59-07:00
. Cách thích hợp để sử dụng gsonBuilder.setDateFormat
để định dạng đúng thời điểm này là gì?GsonBuilder setDateFormat cho "2011-10-26T20: 29: 59-07: 00"
Trả lời
-07:00
là ký hiệu múi giờ ISO 8601. Điều này không được hỗ trợ bởi SimpleDateFormat
cho đến Java 7. Vì vậy, nếu bạn có thể upgrade Java 7, sau đó bạn có thể sử dụng X
để đại diện cho rằng ký hiệu múi giờ:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create();
On Java 6 bạn sẽ cần phải làm một số mô hình kết hợp và thay thế trên chuỗi JSON đầu tiên để thay thế -07:00
phần bởi RFC 822 ký hiệu -0700
để bạn có thể sử dụng Z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
hoặc bởi khu ký hiệu thời gian chung GMT-07:00
để bạn có thể sử dụng z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create();
Đã lâu rồi kể từ khi bài đăng này được đăng, nhưng đã vượt qua nó khi cố gắng sử dụng GSON để phân tích cú pháp phản hồi API có định dạng ngày này. Tôi cho rằng tôi sẽ chia sẻ 2 chức năng nhỏ mà tôi đã viết bằng regex để tìm tất cả các ngày và thay đổi chúng thành định dạng mà GSON có thể phân tích cú pháp.
private static String cleanDateFormat(String json){ // takes in a string of JSON
Pattern regex = Pattern.compile("\\d\\d:\\d\\d:\\d\\d[-\\+]\\d\\d:\\d\\d");
Matcher regexMatcher = regex.matcher(json);
StringBuffer buff = new StringBuffer();
while(regexMatcher.find()){
regexMatcher.appendReplacement(buff, getSubOfMatch(regexMatcher));
}
regexMatcher.appendTail(buff);
return buff.toString();
}
//then pull out the colon.
private static String getSubOfMatch(Matcher matcher){
StringBuilder sb = new StringBuilder(matcher.group(0));
sb.deleteCharAt(sb.length()-3);
return sb.toString();
}
Đối với Java 8 (chưa xác minh cho Java 7), chỉ cần sử dụng các mô hình
yyyy-MM-dd'T'HH:mm:ssXXX
Để có được chính xác định dạng của 2011-10-26T20:29:59-07:00
.
Các mô hình múi giờ là từ Java Date Time - Custom Date Format Patterns
- X
Zone offset Example: X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45
định dạng ngày phản ứng api của tôi là chính xác cùng với bạn, như thế này:
"weather": {
"temperature": 31,
"time": "2016-06-23T09:28:38+08:00"
}
trong dự án Android, tôi sử dụng mã sau đây, cả hai đều làm việc cho tôi.
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
// or, also work
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
.create();
"yyyy-MM-dd'T'HH:mm:ssX"
không hoạt động trong Android, mặc dù tôi đã configed sử dụng Java 8 trong build.gradle
.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
làm thế nào để chúng ta biết định dạng ngày chúng ta nên thiết lập, trong thực tế, bạn có thể tìm thấy câu trả lời từ mã nguồn của SimpleDateFormat.java
:
* <p>Which produces this output when run in the America/Los_Angeles time zone:
* <pre>
* yyyy-MM-dd 1969-12-31
* yyyy-MM-dd 1970-01-01
* yyyy-MM-dd HH:mm 1969-12-31 16:00
* yyyy-MM-dd HH:mm 1970-01-01 00:00
* yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800
* yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000
* yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800
* yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000
* </pre>
Cảm ơn @ BalusC! là "yyy" chứ không phải "yyyy"? – LuxuryMode
Rất tiếc, đó là lỗi đánh máy, nó thực sự phải là 'yyyy'. – BalusC
Giúp tôi rất nhiều. Ước gì tôi có nhiều hơn một upvotes. :) –