我有一个 DateTime
实例,我想将其格式化为字符串。我该怎么做?我想将日期转换为类似于"2013-04-20"的字符串。
intl
包(安装程序)来格式化日期。对于en_US
格式,它非常简单: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
}
有许多格式选项。参考文档:
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
对于非en_US
日期,您需要明确加载区域设置。有关更多信息,请参阅DateFormat
文档。如果您想要更深入地了解每个国家/语言的格式,则date_symbol_data_local.dart
包含所有格式。这也可以工作:
DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);
DateTime.toLocal()
应该可以解决问题。 - EzPizzapubspec.yaml:
dependencies:
intl:
main.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
}
结果:
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
您可以像之前一样指定日期格式:https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html
import 'package:intl/intl.dart';
String formatDate(DateTime date) => new DateFormat("MMMM d").format(date);
产生:3月4日
如果有人想要将一个字符串格式的日期转换为其他字符串格式,首先使用DateTime.parse("2019-09-30"),然后将其传递给DateFormat("日期格式").format(),例如:
dateFormate = DateFormat("dd-MM-yyyy").format(DateTime.parse("2019-09-30"));
DateFormat
但是你的文本中却写着 DateTime.format()
。 - Michel FeinsteinDateTime
转换为 String
(格式化)。如果您想将 String
转换为 DateTime
(解析),请参见 https://dev59.com/ZFUM5IYBdhLWcg3wEM4d/。 - jamesdlin如果您不想添加其他库,您也可以使用此方法
DateTime dateTime = DateTime.now();
String YYYY_MM_DD = dateTime.toIso8601String().split('T').first;
print(YYYY_MM_DD); //2020-11-23
这将为您提供类似社交网络的日期格式:["今天","昨天","星期几",等等..]
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}';
}
}
void main() {
final DateTime now = DateTime.now();
final DateFormat format = DateFormat('yyyy-MM-dd');
final String formatted = format.format(now);
// 2021-03-02
}
或者你可以使用date_format包来在Flutter中格式化日期。
import 'package:date_format/date_format.dart';
final formattedStr = formatDate(DateTime.now(), [dd, '-', mm, '-', yyyy]);
//02-03-2021
另一种方法是使用intl包。
创建一个DateTime的扩展:
date_time_extension.dart
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
extension DateTimeExtension on DateTime {
String format([String pattern = 'dd/MM/yyyy', String? locale]) {
if (locale != null && locale.isNotEmpty) {
initializeDateFormatting(locale);
}
return DateFormat(pattern, locale).format(this);
}
}
在你要使用DateTime类型的地方导入这个文件,然后你可以像这样使用它:
DateTime.now().format();
DateTime.now().format('MM/yyyy');
DateTime.now().format('MM/yyyy', 'es');
有一个名为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"
请注意:分钟是nn