Flutter日期格式化插件dotnetstrftime的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter日期格式化插件dotnetstrftime的使用

Dart包提供了与.NET相同规则的日期格式化功能。该插件基于intltimezone库,因此某些格式可能与.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

1 回复

更多关于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并相应地调整代码。

回到顶部