Flutter时间处理插件millisecs的使用
Flutter时间处理插件millisecs的使用
millisecs
插件用于将各种时间格式转换为毫秒数,并且可以将毫秒数转换回时间格式。它是 Vercel 的 ms
npm 包在 Dart 和 Flutter 中的适配版本。
使用方法
导入
首先需要导入 millisecs
包:
import 'package:millisecs/millisecs.dart';
从时间格式转换到毫秒数
你可以将各种时间格式(如天、小时、分钟等)转换为毫秒数:
ms('2 days'); // 172800000
ms('1d'); // 86400000
ms('10h'); // 36000000
ms('2.5 hrs'); // 9000000.0
ms('2h'); // 7200000
ms('1m'); // 60000
ms('5s'); // 5000
ms('1y'); // 31557600000.0
ms('100'); // 100
ms('-3 days'); // -259200000
ms('-1h'); // -3600000
ms('-200'); // -200
从毫秒数转换到时间格式
你也可以将毫秒数转换为时间格式字符串:
ms(60000); // "1m"
ms(2 * 60000); // "2m"
ms(-3 * 60000); // "-3m"
ms(ms('10 hours')); // "10h"
带有长格式的时间格式
millisecs
还支持带长格式的时间字符串:
ms(60000, long: true); // "1 minute"
ms(2 * 60000, long: true); // "2 minutes"
ms(-3 * 60000, long: true); // "-3 minutes"
ms(ms('10 hours'), long: true); // "10 hours"
解析和格式化
除了直接调用 ms
函数外,还可以使用 parse
和 format
函数进行解析和格式化:
parse('1h'); // 3600000
format(2000); // "2s"
format(2000, long: true); // "2 seconds"
tryParse('1h'); // 3600000
tryFormat(2000); // "2s"
tryParse('🎯'); // null
tryFormat(double.infinity); // null
扩展方法
millisecs
提供了一些扩展方法,可以直接在字符串和数字上调用:
'2.5 hrs'.parseMS(); // 9000000.0
'1y'.parseMS(); // 31557600000.0
'100'.parseMS(); // 100
'-3 days'.parseMS(); // -259200000
'10 hours'.parseMS().formatMS(); // "10h"
6000.formatMS(); // "2m"
(2 * 60000).formatMS(long: true); // "2 minutes"
'1h'.tryParseMS(); // 3600000
'🎯'.tryParseMS(); // null
2000.tryFormatMS(); // "2s"
double.infinity.tryFormatMS(); // null
特性
- 该插件在 Dart 和 Flutter 中均可使用。
- 如果传入一个包含数字和有效单位的字符串,则返回相应的毫秒数。
- 如果传入一个纯数字字符串,则返回该数字本身(例如,
'100'
返回100
)。 - 如果传入一个数字,则返回带有单位的时间字符串。
ms
函数会抛出ArgumentError
错误,如果传入无效的字符串或非有限数值。- 可以使用
tryMS
替代ms
来返回null
而不是抛出错误。 - 解析时大小写不敏感,所以
'2.5 hrs'
和'2.5 HRs'
都会被解析为9000000
。 - 直接的
parse
和format
函数也被暴露出来,ms
是基于它们构建的。 - 扩展方法可用于直接在字符串和数字上调用方法。
其他信息
四舍五入
在格式化时,数值会根据需要四舍五入。例如,ms(1499)
将输出 "1s"
,而 ms(1500)
将输出 "2s"
。
动态类型
ms
函数的参数和返回值都具有 dynamic
类型。这是因为在 Dart 中,目前没有原生支持联合类型的简单方式(如 TypeScript 中的联合类型)。因此,ms
使用了 dynamic
类型来允许多种类型(字符串和数字)的输入和输出。如果你需要更严格的类型控制,可以使用扩展方法或 parse
和 format
函数。
格式化为周和年
在原始代码(Vercel 的代码)中,解析可以达到年份级别,但格式化只到天。然而,在这个 Dart 实现中,格式化包括了周和年,与解析保持一致。如果你习惯于 JavaScript 中的格式化字符串(不包含周和年),请注意在 Dart 中这些格式化字符串是故意包含周和年的。
贡献
如果有任何问题、功能请求或增强需求,请打开一个 Issue 或发送一个 Pull Request。
完整示例
以下是一个完整的 Flutter 应用示例,展示了如何使用 millisecs
插件的各种功能:
import 'package:flutter/material.dart';
import 'package:millisecs/millisecs.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Testing "millisecs" Package',
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text('Testing "millisecs" Package'),
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
Text('Convert from Time Formats',
style: Theme.of(context).textTheme.titleMedium),
ListTile(
title: const Text("ms('2 days')"),
trailing: Text('${ms('2 days')}'),
),
ListTile(
title: const Text("ms('1d')"),
trailing: Text('${ms('1d')}'),
),
ListTile(
title: const Text("ms('10h')"),
trailing: Text('${ms('10h')}'),
),
ListTile(
title: const Text("ms('2.5 hrs')"),
trailing: Text('${ms('2.5 hrs')}'),
),
ListTile(
title: const Text("ms('2h')"),
trailing: Text('${ms('2h')}'),
),
ListTile(
title: const Text("ms('1m')"),
trailing: Text('${ms('1m')}'),
),
ListTile(
title: const Text("ms('5s')"),
trailing: Text('${ms('5s')}'),
),
ListTile(
title: const Text("ms('1y')"),
trailing: Text('${ms('1y')}'),
),
ListTile(
title: const Text("ms('100')"),
trailing: Text('${ms('100')}'),
),
ListTile(
title: const Text("ms('-3 days')"),
trailing: Text('${ms('-3 days')}'),
),
ListTile(
title: const Text("ms('1h')"),
trailing: Text('${ms('1h')}'),
),
ListTile(
title: const Text("ms('-200')"),
trailing: Text('${ms('-200')}'),
),
const SizedBox(height: 32),
Text('Convert from Milliseconds',
style: Theme.of(context).textTheme.titleMedium),
ListTile(
title: const Text('ms(60000)'),
trailing: Text('${ms(60000)}'),
),
ListTile(
title: const Text('ms(2 * 60000)'),
trailing: Text('${ms(2 * 60000)}'),
),
ListTile(
title: const Text('ms(-3 * 60000)'),
trailing: Text('${ms(-3 * 60000)}'),
),
ListTile(
title: const Text("ms(ms('10 hours'))"),
trailing: Text('${ms(ms('10 hours'))}'),
),
const SizedBox(height: 32),
Text('Time Format Written-Out',
style: Theme.of(context).textTheme.titleMedium),
ListTile(
title: const Text('ms(60000, long: true)'),
trailing: Text('${ms(60000, long: true)}'),
),
ListTile(
title: const Text('ms(2 * 60000, long: true)'),
trailing: Text('${ms(2 * 60000, long: true)}'),
),
ListTile(
title: const Text('ms(-3 * 60000, long: true)'),
trailing: Text('${ms(-3 * 60000, long: true)}'),
),
ListTile(
title: const Text("ms(ms('10 hours'), long: true)"),
trailing: Text('${ms(ms('10 hours'), long: true)}'),
),
const SizedBox(height: 32),
Text('parse and format',
style: Theme.of(context).textTheme.titleMedium),
ListTile(
title: const Text("parse('1h')"),
trailing: Text('${parse('1h')}'),
),
ListTile(
title: const Text('format(2000)'),
trailing: Text(format(2000)),
),
ListTile(
title: const Text('format(2000, long: true)'),
trailing: Text(format(2000, long: true)),
),
const SizedBox(height: 16),
ListTile(
title: const Text("tryParse('1h')"),
trailing: Text('${tryParse('1h')}'),
),
ListTile(
title: const Text('tryFormat(2000)'),
trailing: Text('${tryFormat(2000)}'),
),
const SizedBox(height: 16),
ListTile(
title: const Text("tryParse('🎯')"),
trailing: Text('${tryParse('🎯')}'),
),
ListTile(
title: const Text('tryFormat(double.infinity)'),
trailing: Text('${tryFormat(double.infinity)}'),
),
const SizedBox(height: 32),
Text('Extensions', style: Theme.of(context).textTheme.titleMedium),
ListTile(
title: const Text("'2.5 hrs'.parseMS()"),
trailing: Text('${'2.5 hrs'.parseMS()}'),
),
ListTile(
title: const Text("'1y'.parseMS()"),
trailing: Text('${'1y'.parseMS()}'),
),
ListTile(
title: const Text("'100'.parseMS()"),
trailing: Text('${'100'.parseMS()}'),
),
ListTile(
title: const Text("'-3 days'.parseMS()"),
trailing: Text('${'-3 days'.parseMS()}'),
),
const SizedBox(height: 16),
ListTile(
title: const Text("'10 hours'.parseMS().formatMS()"),
trailing: Text('10 hours'.parseMS().formatMS()),
),
ListTile(
title: const Text('6000.formatMS()'),
trailing: Text(6000.formatMS()),
),
ListTile(
title: const Text('(2 * 6000).formatMS(long: true)'),
trailing: Text((2 * 6000).formatMS(long: true)),
),
const SizedBox(height: 16),
ListTile(
title: const Text("'1h'.tryParseMS()"),
trailing: Text('${'1h'.tryParseMS()}'),
),
ListTile(
title: const Text("'🎯'.tryParseMS()"),
trailing: Text('${'🎯'.tryParseMS()}'),
),
ListTile(
title: const Text('2000.tryFormatMS()'),
trailing: Text('${2000.tryFormatMS()}'),
),
ListTile(
title: const Text('double.infinity.tryFormatMS()'),
trailing: Text('${double.infinity.tryFormatMS()}'),
),
],
),
);
}
}
更多关于Flutter时间处理插件millisecs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter时间处理插件millisecs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,处理时间的插件有很多,其中millisecs
是一个可以方便地进行时间计算和格式化的插件。虽然millisecs
这个具体的包名在Flutter社区中可能不是特别常见(可能指的是类似功能的包,比如date_format
、intl
等用于日期时间处理的包),但我可以给你一个使用类似功能插件的示例代码,展示如何在Flutter中处理时间。
这里,我将使用intl
包作为示例,因为它是一个非常流行且功能强大的日期时间处理库。
首先,你需要在pubspec.yaml
文件中添加intl
依赖:
dependencies:
flutter:
sdk: flutter
intl: ^0.17.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个使用intl
包进行时间处理的示例代码:
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Time Handling Example'),
),
body: Center(
child: TimeHandlingExample(),
),
),
);
}
}
class TimeHandlingExample extends StatefulWidget {
@override
_TimeHandlingExampleState createState() => _TimeHandlingExampleState();
}
class _TimeHandlingExampleState extends State<TimeHandlingExample> {
DateTime _currentTime = DateTime.now();
String _formattedTime = '';
@override
void initState() {
super.initState();
_formatTime();
}
void _formatTime() {
// 使用intl包格式化时间
DateFormat formatter = DateFormat('yyyy-MM-dd HH:mm:ss');
setState(() {
_formattedTime = formatter.format(_currentTime);
});
}
void _addMilliseconds(int milliseconds) {
setState(() {
_currentTime = _currentTime.add(Duration(milliseconds: milliseconds));
_formatTime();
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Current Formatted Time: $_formattedTime',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () => _addMilliseconds(1000), // 增加1秒
child: Text('Add 1 Second'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () => _addMilliseconds(60000), // 增加1分钟
child: Text('Add 1 Minute'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () => _addMilliseconds(3600000), // 增加1小时
child: Text('Add 1 Hour'),
),
],
);
}
}
在这个示例中,我们做了以下几件事:
- 使用
intl
包来格式化当前时间。 - 创建了一个按钮,点击后可以增加指定的毫秒数到当前时间,并重新格式化显示。
如果你确实是在寻找一个名为millisecs
的特定包,并且它提供了不同的API,你可能需要查阅该包的官方文档或GitHub仓库来获取具体的用法。不过,大多数日期时间处理的需求都可以通过intl
包或其他流行的日期时间处理库来满足。