Làm cách nào để định dạng một ngày với Dart?


140

Tôi có một ví dụ DateTimevà tôi muốn định dạng nó thành Chuỗi. Làm thế nào để làm điều đó? Tôi muốn biến ngày thành một chuỗi, đại loại như "2013-04-20".

Câu trả lời:


296

Bạn có thể sử dụng intlgói (trình cài đặt ) để định dạng ngày.

Đối với en_UScác định dạng, nó khá đơn giản:

import 'package:intl/intl.dart';

main() {
  final DateTime now = DateTime.now();
  final DateFormat formatter = DateFormat('yyyy-MM-dd');
  final String formatted = formatter.format(now);
  print(formatted); // something like 2013-04-20
}

Có nhiều lựa chọn để định dạng. Từ các tài liệu:

ICU Name                   Skeleton
--------                   --------
DAY                          d
ABBR_WEEKDAY                 E
WEEKDAY                      EEEE
ABBR_STANDALONE_MONTH        LLL
STANDALONE_MONTH             LLLL
NUM_MONTH                    M
NUM_MONTH_DAY                Md
NUM_MONTH_WEEKDAY_DAY        MEd
ABBR_MONTH                   MMM
ABBR_MONTH_DAY               MMMd
ABBR_MONTH_WEEKDAY_DAY       MMMEd
MONTH                        MMMM
MONTH_DAY                    MMMMd
MONTH_WEEKDAY_DAY            MMMMEEEEd
ABBR_QUARTER                 QQQ
QUARTER                      QQQQ
YEAR                         y
YEAR_NUM_MONTH               yM
YEAR_NUM_MONTH_DAY           yMd
YEAR_NUM_MONTH_WEEKDAY_DAY   yMEd
YEAR_ABBR_MONTH              yMMM
YEAR_ABBR_MONTH_DAY          yMMMd
YEAR_ABBR_MONTH_WEEKDAY_DAY  yMMMEd
YEAR_MONTH                   yMMMM
YEAR_MONTH_DAY               yMMMMd
YEAR_MONTH_WEEKDAY_DAY       yMMMMEEEEd
YEAR_ABBR_QUARTER            yQQQ
YEAR_QUARTER                 yQQQQ
HOUR24                       H
HOUR24_MINUTE                Hm
HOUR24_MINUTE_SECOND         Hms
HOUR                         j
HOUR_MINUTE                  jm
HOUR_MINUTE_SECOND           jms
HOUR_MINUTE_GENERIC_TZ       jmv
HOUR_MINUTE_TZ               jmz
HOUR_GENERIC_TZ              jv
HOUR_TZ                      jz
MINUTE                       m
MINUTE_SECOND                ms
SECOND                       s

Đối với các en_USngày không , bạn cần tải rõ ràng tại miền địa phương. Xem DateFormattài liệu để biết thêm. Bao date_symbol_data_local.dartgồm tất cả các định dạng cho mỗi quốc gia / ngôn ngữ, nếu bạn muốn có một cái nhìn sâu hơn.


Là intl bị hỏng? Uncaught Error: FileSystemException: Không thể mở tệp, path = 'E: \ dart \ ws \ web \ tests \ intl \ intl.dart' (Lỗi hệ điều hành: Hệ thống không thể tìm thấy đường dẫn được chỉ định.
javapadawan

1
Có cách nào để thêm mili giây vào định dạng không?
Kaspi

2
yêu cầu phụ thuộc pubspec.yaml: intl: ^ 0.15.7
murt

Làm thế nào chúng ta có thể lấy chỉ tháng, ví dụ. 1 cho tháng một, 2 cho tháng hai ...? tôi đã thử định dạng DateFormat ('MM'). (DateTime.now ()); nhưng không hoạt động trong rung. Hãy chia sẻ đề xuất của bạn.
Kam Meat

@Kaspi thử 'S' trong giây thứ hai
badelectron77

31

Điều này cũng sẽ làm việc:

DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);


12

Nếu ai đó muốn chuyển đổi một ngày ở định dạng chuỗi sang một số định dạng chuỗi khác, trước tiên hãy sử dụng DateTime.parse ("2019-09-30") sau đó chuyển nó sang DateFormat ("mẫu ngày").

dateFormate = DateFormat("dd-MM-yyyy").format(DateTime.parse("2019-09-30"));

Tham khảo: Phi tiêu - Cách thay đổi định dạng của chuỗi ngày đơn giản trong yyyy-MM-dd thành dd-MM-yyyy


1
mã của bạn sử dụng DateFormatnhưng văn bản của bạn nóiDateTime.format()
mFeinstein

Giáo sư! một sự nhầm lẫn. Thay đổi :)
Shashank

10

Điều này cung cấp cho bạn ngày như trong một mạng xã hội: ["hôm nay", "ngày hôm qua", "dayoftheweek", v.v.]

void main() {
      DateTime now = new DateTime(2018,6,26);
      print(date(now));
    }
    
    String date(DateTime tm) {
      DateTime today = new DateTime.now();
      Duration oneDay = new Duration(days: 1);
      Duration twoDay = new Duration(days: 2);
      Duration oneWeek = new Duration(days: 7);
      String month;
      switch (tm.month) {
        case 1:
          month = "january";
          break;
        case 2:
          month = "february";
          break;
        case 3:
          month = "march";
          break;
        case 4:
          month = "april";
          break;
        case 5:
          month = "may";
          break;
        case 6:
          month = "june";
          break;
        case 7:
          month = "july";
          break;
        case 8:
          month = "august";
          break;
        case 9:
          month = "september";
          break;
        case 10:
          month = "october";
          break;
        case 11:
          month = "november";
          break;
        case 12:
          month = "december";
          break;
      }
    
      Duration difference = today.difference(tm);
    
      if (difference.compareTo(oneDay) < 1) {
        return "today";
      } else if (difference.compareTo(twoDay) < 1) {
        return "yesterday";
      } else if (difference.compareTo(oneWeek) < 1) {
        switch (tm.weekday) {
          case 1:
            return "monday";
          case 2:
            return "tuesday";
          case 3:
            return "wednesday";
          case 4:
            return "thursday";
          case 5:
            return "friday";
          case 6:
            return "saturday";
          case 7:
            return "sunday";
        }
      } else if (tm.year == today.year) {
        return '${tm.day} $month';
      } else {
        return '${tm.day} $month ${tm.year}';
      }
    }

1
Rất hữu ích - cảm ơn bạn. Thêm dòng bổ sung này ở đầu phương thức nếu bạn đang vượt qua các ngày có thời gian, nếu không thì 'ngày hôm qua' có thể không hoạt động: tm = DateTime (tm.year, tm.month, tm.day);
Nick Wright

8

Có một gói date_format

dependencies:
    date_format:

import 'package:date_format/date_format.dart';

final formattedStr = formatDate(
    yourDateTime, [dd, '.', mm, '.', yy, ' ', HH, ':', nn]);

// output example "29.03.19 07:00"

Chú ý: phút là nn

liên kết đến gói


2

pubspec.yaml:

dependencies:
  intl:

chính.dart:

import 'package:intl/intl.dart'; // for date format
import 'package:intl/date_symbol_data_local.dart'; // for other locales

void main() {
  var now = DateTime.now();
  print(DateFormat().format(now)); // This will return date using the default locale
  print(DateFormat('yyyy-MM-dd hh:mm:ss').format(now));
  print(DateFormat.yMMMMd().format(now)); // print long date 
  print(DateFormat.yMd().format(now)); // print short date 
  print(DateFormat.jms().format(now)); // print time 

  initializeDateFormatting('es'); // This will initialize Spanish locale
  print(DateFormat.yMMMMd('es').format(now)); // print long date in Spanish format
  print(DateFormat.yMd('es').format(now)); // print short date in Spanish format
  print(DateFormat.jms('es').format(now)); // print time in Spanish format
}

Kết quả:

May 31, 2020 5:41:42 PM
2020-05-31 05:41:42
May 31, 2020
5/31/2020
5:41:42 PM
31 de mayo de 2020
31/5/2020
17:41:42

1

Trong trường hợp bạn muốn kết hợp một số định dạng ngày thành một, đây là cách chúng tôi có thể thực hiện bằng cách sử dụng intl.

DateFormat('yMMMd').addPattern(DateFormat.HOUR24_MINUTE).format(yourDateTime))

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

main() {
  var formattedDate = new DateTime.Format('yyyy-MM-dd').DateTime.now();
  print(formattedDate); // something like 2020-04-16
}

Để biết thêm chi tiết có thể tham khảo Tài liệu DateFormat


0

xử lý các quý hàng năm, từ chuỗi đến DateTime, tôi không tìm thấy giải pháp phù hợp nên đã thực hiện điều này:

    List<String> dateAsList = 'Q1 2001'.split(' ');
    DateTime dateTime = DateTime.now();
    String quarter = dateAsList[0];
    int year = int.parse(dateAsList[1]);
    switch(quarter) {
      case "Q1": dateTime = DateTime(year, 1);
      break;
      case "Q2": dateTime = DateTime(year, 4);
      break;
      case "Q3": dateTime = DateTime(year, 7);
      break;
      case "Q4": dateTime = DateTime(year, 10);
      break;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.