Flutter日期格式化插件dotnetstrftime的使用
Flutter日期格式化插件dotnetstrftime的使用
Dart包提供了与.NET相同规则的日期格式化功能。该插件基于intl
和timezone
库,因此某些格式可能与.NET不完全一致。例如,在意大利语环境下,时间分隔符应返回.
,但当前实现返回的是:
。大多数情况下,这些差异很小。
使用方法
单例模式
// 2023年5月8日 14时42分50秒
var dtWithEmptyMilliseconds = DateTime(2023, 05, 08, 14, 42, 50, 000, 678);
// 使用单个字符进行格式化
dtWithEmptyMilliseconds.formatAsDotNET("d"); // 输出 "5/8/2023"
多个令牌
// 2023年5月8日 14时42分50秒
var dtWithEmptyMilliseconds = DateTime(2023, 05, 08, 14, 42, 50, 000, 678);
// 使用多个字符进行格式化
dtWithEmptyMilliseconds.formatAsDotNET("dd-MM-yy"); // 输出 "05-08-23"
支持的令牌
当只提供一个令牌时,解析器进入单例模式,将特定令牌解析为完整的标准日期格式:
单例令牌
Token | .NET | 本Dart包 | 描述 | 输出 |
---|---|---|---|---|
d | ✅ | ✅ | 短日期模式 | 2009-06-15T13:45:30 -> 6/15/2009 (en-US) |
f | ✅ | ✅ | 完整日期/时间模式(短时间) | 2009-06-15T13:45:30 -> Monday, June 15, 2009 1:45 PM (en-US) |
F | ✅ | ✅ | 完整日期/时间模式(长时间) | 2009-06-15T13:45:30 -> Monday, June 15, 2009 1:45:30 PM (en-US) |
g | ✅ | ✅ | 通用日期/时间模式(短时间) | 2009-06-15T13:45:30 -> 6/15/2009 1:45 PM (en-US) |
m | ✅ | ✅ | 月/日模式 | 2009-06-15T13:45:30 -> June 15 (en-US) |
s | ✅ | ✅ | 可排序的日期/时间模式 | 2009-06-15T13:45:30 -> 2009-06-15T13:45:30 |
t | ✅ | ✅ | 短时间模式 | 2009-06-15T13:45:30 -> 1:45 PM (en-US) |
y | ✅ | ✅ | 年月模式 | 2009-06-15T13:45:30 -> June 2009 (en-US) |
z | ✅ | ✅ |
多个令牌
当提供多个令牌时,解析器会单独解析每个令牌,允许构建有序的时间格式:
Token | .NET | 本Dart包 | 描述 | 输出 |
---|---|---|---|---|
d | ✅ | ✅ | 月份中的天数,从0到31 | 2009-06-01T13:45:30 -> 01 |
dd | ✅ | ✅ | 月份中的天数模式,从00到31 | 2009-06-01T13:45:30 -> 01 |
ddd | ✅ | ✅ | 缩写的月份中的天数模式 | 2009-06-15T13:45:30 -> Mon (en-US) |
dddd | ✅ | ✅ | 完整的月份中的天数模式 | 2009-06-15T13:45:30 -> Monday (en-US) |
D | ✅ | ✅ | 长日期模式 | 2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US) |
f | ✅ | ✅ | 十秒 | 2009-06-15T13:45:30.617542 -> 6 |
ff | ✅ | ✅ | 百分之一秒 | 2009-06-15T13:45:30.617542 -> 61 |
fff | ✅ | ✅ | 毫秒 | 6/15/2009 13:45:30.617542 -> 617 |
ffff | ✅ | ✅ | 十万分之一秒 | 2009-06-15T13:45:30.617542 -> 6175 |
fffff | ✅ | ✅ | 百万分之一秒 | 2009-06-15T13:45:30.617542 -> 61754 |
ffffff | ✅ | ✅ | 千万分之一秒 | 2009-06-15T13:45:30.6175420 -> 617542 |
ffffff | ✅ | ✅ | 十万分之一秒 | 2009-06-15T13:45:30.6175425 -> 6175425 |
F | ✅ | ✅ | 如果非零,十秒 | 2009-06-15T13:45:30.617542 -> 6 2009-06-15T13:45:30.0050000 -> (无输出) |
FF | ✅ | ✅ | 如果非零,百分之一秒 | 2009-06-15T13:45:30.617542 -> 61 2009-06-15T13:45:30.0050000 -> (无输出) |
FFF | ✅ | ✅ | 如果非零,毫秒 | 2009-06-15T13:45:30.617542 -> 617 2009-06-15T13:45:30.0050000 -> (无输出) |
FFFF | ✅ | ✅ | 如果非零,十万分之一秒 | 2009-06-15T13:45:30.617542 -> 6175 2009-06-15T13:45:30.0050000 -> (无输出) |
FFFFF | ✅ | ✅ | 如果非零,百万分之一秒 | 2009-06-15T13:45:30.617542 -> 61754 2009-06-15T13:45:30.0050000 -> (无输出) |
FFFFFF | ✅ | ✅ | 如果非零,千万分之一秒 | 2009-06-15T13:45:30.617542 -> 617542 2009-06-15T13:45:30.0050000 -> (无输出) |
FFFFFF | ✅ | ✅ | 如果非零,十万分之一秒 | 2009-06-15T13:45:30.617542 -> 617542 2009-06-15T13:45:30.0050000 -> (无输出) |
g | ✅ | ✅ | 时期或纪元 | 2009-06-15T13:45:30.6170000 -> A.D. |
gg | ✅ | ✅ | 时期或纪元 | 2009-06-15T13:45:30.6170000 -> A.D. |
G | ✅ | ✅ | 通用日期/时间模式(长时) | 2009-06-15T13:45:30 -> 6/15/2009 1:45:30 PM (en-US) |
h | ✅ | ✅ | 12小时制下的小时,从1到12 | 2009-06-15T01:45:30 -> 1 2009-06-15T13:45:30 -> 1 |
hh | ✅ | ✅ | 12小时制下的小时,从01到12 | 2009-06-15T01:45:30 -> 01 2009-06-15T13:45:30 -> 01 |
H | ✅ | ✅ | 24小时制下的小时,从0到23 | 2009-06-15T01:45:30 -> 1 2009-06-15T13:45:30 -> 13 |
HH | ✅ | ✅ | 24小时制下的小时,从00到23 | 2009-06-15T01:45:30 -> 01 2009-06-15T13:45:30 -> 13 |
K | ✅ | ✅ | 时区信息 | 2009-06-15T13:45:30, Kind Unspecified -> (无输出) 2009-06-15T13:45:30, Kind Utc -> Z 2009-06-15T13:45:30, Kind Local -> -07:00 (取决于本地计算机设置) |
m | ✅ | ✅ | 分钟,从0到59 | 2009-06-15T13:00:30 -> 0 (en-US) |
mm | ✅ | ✅ | 分钟,从00到59 | 2009-06-15T13:00:30 -> 00 (en-US) |
M | ✅ | ✅ | 月/日模式 | 2009-06-15T13:45:30 -> June 15 (en-US) |
M* | ✅ | ✅ | 月,从1到12 | 2009-06-15T13:45:30 -> 6 |
MM | ✅ | ✅ | 月,从01到12 | 2009-06-15T13:45:30 -> 06 |
MMM | ✅ | ✅ | 月的缩写名 | 2009-06-15T13:45:30 -> Jun (en-US) |
MMMM | ✅ | ✅ | 月的全称 | 2009-06-15T13:45:30 -> June (en-US) |
o | ✅ | ✅ | 往返日期/时间模式 | 2009-06-15T13:45:30-07:00 -> 2009-06-15T13:45:30.0000000-07:00 |
O | ✅ | ✅ | 往返日期/时间模式 | 2009-06-15T13:45:30-07:00 -> 2009-06-15T13:45:30.0000000-07:00 |
r | ✅ | ✅ | RFC1123模式 | 2009-06-15T13:45:30 -> Mon, 15 Jun 2009 13:45:30 GMT |
R | ✅ | ✅ | RFC1123模式 | 2009-06-15T13:45:30 -> Mon, 15 Jun 2009 13:45:30 GMT |
s | ✅ | ✅ | 秒,从0到59 | 2009-06-15T13:45:09 -> 9 |
ss | ✅ | ✅ | 秒,从00到59 | 2009-06-15T13:45:09 -> 09 |
t | ✅ | ✅ | AM/PM标志的第一个字符 | 009-06-15T13:45:30 -> P (en-US) |
tt | ✅ | ✅ | AM/PM标志 | 009-06-15T13:45:30 -> PM (en-US) |
T | ✅ | ✅ | 长时间模式 | 2009-06-15T13:45:30 -> 1:45:30 PM (en-US) |
TT | ✅ | ✅ | ||
u | ✅ | ✅ | 全球可排序日期/时间模式 | 2009-06-15T13:45:30 -> 2009-06-15 20:45:30Z |
U | ✅ | ✅ | 全球完整日期/时间模式 | 2009-06-15T13:45:30 -> Monday, June 15, 2009 8:45:30 PM (en-US) |
y | ✅ | ✅ | 年份,从0到99 | 0001-01-01T00:00:00 -> 1 |
yy | ✅ | ✅ | 年份,从00到99 | 0001-01-01T00:00:00 -> 01 |
yyy | ✅ | ✅ | 至少三位数的年份 | 0001-01-01T00:00:00 -> 001 |
yyyy | ✅ | ✅ | 四位数的年份 | 0001-01-01T00:00:00 -> 0001 |
yyyyy | ✅ | ✅ | 五位数的年份 | 0001-01-01T00:00:00 -> 00001 |
Y | ✅ | ✅ | 年月模式 | 2009-06-15T13:45:30 -> June 2009 (en-US) |
z | ✅ | ✅ | 时区偏移小时数 | 2009-06-15T13:45:30-07:00 -> -7 |
zz | ✅ | ✅ | 时区偏移小时数,单个数字前加0 | 2009-06-15T13:45:30-07:00 -> -07 |
zzz | ✅ | ✅ | 时区偏移小时数和分钟数 | 2009-06-15T13:45:30-07:00 -> -07:00 |
\ | ✅ | ✅ | 转义字符 | 987654 “###00#” -> #987654# |
‘string’ | ✅ | ✅ | 字面字符串分隔符 | 68 “#” “degrees” -> 68 degrees |
0 | ✅ | ✅ | 零占位符 | 1234.5678 (“00000”) -> 01235 |
# | ✅ | ✅ | 数字占位符 | 1234.5678 ("#####") -> 1235 |
. | ✅ | ✅ | 小数点 | 0.45678 (“0.00”, en-US) -> 0.46 |
, | ✅ | ✅ | 组分隔符和数字缩放 | 2147483647 ("##,#", en-US) -> 2,147,483,647 |
; | ✅ | ✅ | 部分分隔符 | 0.3697 ("%#0.00", en-US) -> %36.97 |
% | ✅ | ✅ | 百分比占位符 | 0.3697 ("%#0.00", en-US) -> %36.97 |
‰ | ✅ | ✅ | 千分比占位符 | 0.03697 ("#0.00‰", en-US) -> 36.97‰ |
E0 | ✅ | ✅ | 指数表示法 | |
E+0 | ✅ | ✅ | 指数表示法 | |
E-0 | ✅ | ✅ | 指数表示法 | |
e0 | ✅ | ✅ | 指数表示法 | 987654 ("#0.0e0") -> 98.8e4 |
e+0 | ✅ | ✅ | 指数表示法 | 1.8901385E-16 (“0.0e+00”) -> 1.9e-16 |
e-0 | ✅ | ✅ | 指数表示法 |
字面字符串
在输出中添加用双引号括起来的字面字符串以获得未解析的字符串:
final now = DateTime.now();
now.formatAsDotNET('dd "days"'); // 输出 "15 days"
更多关于Flutter日期格式化插件dotnetstrftime的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter日期格式化插件dotnetstrftime的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用dotnet_strftime
插件来格式化日期的示例代码。dotnet_strftime
插件允许你使用类似于C#的strftime语法来格式化日期和时间。
首先,你需要在你的pubspec.yaml
文件中添加这个依赖:
dependencies:
flutter:
sdk: flutter
dotnet_strftime: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装这个依赖。
接下来是一个完整的示例代码,展示如何使用dotnet_strftime
插件来格式化日期:
import 'package:flutter/material.dart';
import 'package:dotnet_strftime/dotnet_strftime.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
DateTime currentDate = DateTime.now();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Date Formatting with dotnet_strftime'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Current Date and Time: ${currentDate.toLocal()}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
'Formatted Date (yyyy-MM-dd): ${formatDate(currentDate, 'yyyy-MM-dd')}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
'Formatted Date (EEEE, MMMM dd, yyyy): ${formatDate(currentDate, 'EEEE, MMMM dd, yyyy')}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
Text(
'Formatted Time (HH:mm:ss): ${formatDate(currentDate, 'HH:mm:ss')}',
style: TextStyle(fontSize: 20),
),
],
),
),
);
}
String formatDate(DateTime date, String pattern) {
// 使用 dotnet_strftime 插件格式化日期
return DateFormat(pattern).format(date);
}
}
注意:在上面的代码中,DateFormat
类是从dotnet_strftime
包中导入的。这个类允许你使用类似于C#的strftime语法来格式化日期。
然而,需要注意的是,dotnet_strftime
插件的具体用法和API可能有所不同,取决于它的实现和版本。上面的代码假设dotnet_strftime
提供了一个DateFormat
类和一个format
方法,但实际情况可能有所不同。因此,请务必查阅最新的dotnet_strftime
文档和示例代码,以确保正确使用该插件。
如果你发现dotnet_strftime
插件没有提供上述DateFormat
类,你可能需要使用其他方法,比如Flutter内置的intl
包来进行日期格式化。在这种情况下,你需要将依赖替换为intl
并相应地调整代码。