티스토리 뷰

반응형

[1] 장고

 

장고에서 내려주는 DateTime fomat은  iso-8601 입니다. 

(참고: www.django-rest-framework.org/api-guide/fields/#datetimefield )

 

예를 들어 

"2020-10-10T14:58:04+09:00"

이런식으로 값을 내려줍니다. 

 

 

iso-8601 포맷의 각 필드에 대한 설명은 이 블로그에서 참조해주세요~

 

https://java119.tistory.com/24

 

[2] 플러터

 

2.1 DateTime 

 

다트에서 시간을 표현하는 타입은 DateTime 입니다. 

문서를 보면 DateTime만들기, DateTime에서 시,분, 초 구하기 등등이 엄청 간단하게 잘되어있어요 (감동)

(swift에서는 extension으로 만들어서 썼었는데,,) 

 

 

 

2.2 DateTime의 parse 메소드

 

저는 formattedString을 DateTime으로 바꿔주는 parse 메소드를 사용해줄 것입니다! 

 

이 메소드는 subset of ISO 8601 을 파싱할 수 있다고 합니다. 

예를들어 아래와 같은 ISO 8601 포맷의 스트링을 파싱할 수 있습니다. 

만약 input string을 파싱할 수 없으면  FormatException 을 던진다고 합니다. 

 

 

저는 장고에서 이런식으로 json을 내려줘서

{"create_date":"2020-10-10T14:58:04+09:00"}

 

이렇게 DateTime을 구했습니다. 

DateTime createdDate = DateTime.parse(json["create_date"]);

 

 

2.3 DateFormat

DateTime을 이렇게 멋진 영어 string으로 fomatting해서 보여주고 싶다면 어떻게 해야할까요-?! 

 

 

DateFormat 을 살펴보면 됩니다. 

DateFormat을 만들고 format이라는 메소드에 DateTime을 넣어주면 formatted string을 구할 수 있습니다. 

 

 

자신이 원하는 패턴이랑 나라(locale)를 넣어서 직접 DateFormat을 만들 수 도 있고

내장된 생성자들을 편하게 쓸 수 도 있어요 

 

 

아래 예제처럼 이미 내장된 생성자를 쓰면 

편하게 DateTime을 포맷팅 할 수 있답니다. 

 

 

그리고 locale은 지정안해주면 디폴트값이 en_US입니다. 

 

 

 

그럼 저의 예제에서 써볼게요-!

우선 DateFormat은 intl 패키지 안에 있기때문에 

 

 

import를 먼저 해줍니다. 

import 'package:intl/intl.dart';

 

저는 yMMd 패턴으로 DateFormat을 만들고

아까 구한 DateTime을 포맷팅해줬습니다. 

DateTime createdDate = DateTime.parse(json["create_date"]);
String createdDateString = DateFormat.yMMMd('en_US').format(createdDate);
print(createdDateString);  // Oct 4, 2020

 

 

그래서 최종 Question 모델 코드는 이렇게 완성되었습니다. 

 

import 'dart:convert';
import 'package:intl/intl.dart';

class Question {
  String id;
  String title;
  String createdDateString;

  Question({
    this.id,
    this.title,
    this.createdDateString
  });

  Question.fromJson(Map<String, dynamic> json) {
    id = json["id"];
    title = json["title"];
    DateTime createdDate = DateTime.parse(json["create_date"]);
    createdDateString = DateFormat.yMMMd('en_US').format(createdDate);
  }
}
반응형
댓글