Luckean's blog Luckean's blog
首页
  • 前端文章

    • JavaScript
  • 项目笔记

    • 项目笔记
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • flutter 布局
  • dart 数组的定义
  • java目录
  • jenkins配置
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • vscode vim 结合使用
  • vscode vim 汇总
  • vscode快捷键
  • vscode自定义快捷键
  • typora 使用技巧
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

Luckean

前端界的小学生
首页
  • 前端文章

    • JavaScript
  • 项目笔记

    • 项目笔记
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • flutter 布局
  • dart 数组的定义
  • java目录
  • jenkins配置
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • vscode vim 结合使用
  • vscode vim 汇总
  • vscode快捷键
  • vscode自定义快捷键
  • typora 使用技巧
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • 项目

  • widget

  • dart

    • dart 数组的定义
    • 时间 DateTime
    • 时间 DateTime
    • 浮点 double 取整 保留小数
  • ios

  • andriod

  • app上架

  • plug

  • 安装

  • 错误信息记录

  • Flutter
  • dart
Luckean
2022-06-18

时间 DateTime

近期在研究 Dart 源码, 把关于 Date 这一块写个文章进行整理分享。

在 Dart 中操作日期通过 DateTime 类来实现。

由于 DateTime 是 Dart 内置的,所以不需要导入。

# 解析

  • DateTime
  • DateTime.parse
  • DateTime.tryParse
  • DateTime.utc

解析一个日期可以通过 DateTime.parse 静态方法

一个典型的例子:

String str = '2020-02-20 22:48:18';
DateTime date = DateTime.parse(str);

print(date);  // 2020-02-20 22:48:18.000
复制代码
1
2
3
4
5

parse 参数接收一个字符串, 能够被解析的有以下格式:

/**
  * "2012-02-27 13:27:00"
  * "2012-02-27 13:27:00.123456789z"
  * "2012-02-27 13:27:00,123456789z"
  * "20120227 13:27:00"
  * "20120227T132700"
  * "20120227"
  * "+20120227"
  * "2012-02-27T14Z"
  * "2012-02-27T14+00:00"
  * "-123450101 00:00:00 Z"
  * "2002-02-27T14:00:00-0500"
  */
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14

parse 方法还有一个对应的 tryParse 的静态方法, 实际上就是 parse 的语法糖

tryParse` 如果接收的参数无法被解析那么不会抛出异常,而是返回 `null
1

tryParse 的内部实现原理:

try {
  return parse(formattedString);
} on FormatException {
  return null;
}
复制代码
1
2
3
4
5
6

还可以通过 DateTime 实例进行解析, 可以接收8个参数,第一个是年份必填,剩余的是选填,如下:

/**
 *  DateTime(int year,
 *     [int month = 1,
 *     int day = 1,
 *     int hour = 0,
 *     int minute = 0,
 *     int second = 0,
 *     int millisecond = 0,
 *     int microsecond = 0])
 */
DateTime date = DateTime(2020);

// 2020年2月22日 22小时22分22秒
DateTime date2 = DateTime(2020, 2, 22, 22, 22, 22);
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

如果想解析成 utc , 可以调用它的静态方法,参数和 DateTime 一致

DateTime date1 = DateTime.utc(2020, 2, 22, 22, 22, 22);
复制代码
1
2

# 取值

取得当前时间

DateTime n = DateTime.now();
print(n);   // 2020-02-20 23:05:04.332418
复制代码
1
2
3

取得一个以毫秒时间戳

int t = DateTime.now().millisecondsSinceEpoch;
print(t);  // 1582211214849
复制代码
1
2
3

取得一个以微秒时间戳

int t = DateTime.now().microsecondsSinceEpoch;
print(t);  // 1582211566844552
复制代码
1
2
3

取得当前时区

String timeZone = DateTime.now().timeZoneName;
print(timeZone);
复制代码
1
2
3

取得一周的星期几

int w = DateTime.now().weekday;
print(w);  // 4
复制代码
1
2
3

取得当前时区的偏移时差 (北京时区是东八区,领先UTC八个小时)

Duration offset = DateTime.now().timeZoneOffset;
print(offset);    // 8:00:00.000000
复制代码
1
2
3

取得当前年份

int year = DateTime.now().year;
print(year);      // 2020
复制代码
1
2
3

取得当前月份 (1-12), 这跟JS里有点不同

int month = DateTime.now().month;
print(month);      // 2
复制代码
1
2
3

取得当前月份的第几天 (1-31)

int day = DateTime.now().day;
print(day);      // 21
复制代码
1
2
3

取得当前小时 (0-23)

int hour = DateTime.now().hour;
print(hour);      // 8
复制代码
1
2
3

取得当前分钟 (0-59)

int minute = DateTime.now().minute;
print(minute);      // 18
复制代码
1
2
3

取得当前秒 (0-59)

int second = DateTime.now().second;
print(second);      // 18
复制代码
1
2
3

取得当前毫秒 (0-999)

int millisecond = DateTime.now().millisecond;
print(millisecond);      // 249
复制代码
1
2
3

取得当前微秒 (0-999)

int microsecond = DateTime.now().microsecond;
print(microsecond);      // 249
复制代码
1
2
3

# 显示

  • toString
  • toIso8601String
  • toLocal
  • toUtc

toString 要把一个 DateTime 转换成时间可以使用 toString 方法

String str = DateTime.now().toString();
print(str);     // 2020-02-22 01:01:01.182096
复制代码
1
2
3

toIso8601String 转换成 ISO 8601 (opens new window)

String str = DateTime.now().toIso8601String();
print(str);   // 2020-02-22T22:12:30.159729
复制代码
1
2
3

toLocal 在本地时区返回此DateTime值

DateTime date = DateTime.now().toLocal();
print(date);   // 2020-02-22 22:27:57.641258
复制代码
1
2
3

toUtc 在UTC时区中返回此DateTime值

DateTime date = DateTime.now().toUtc();
print(date);   // 2020-02-22 03:27:09.564188Z
复制代码
1
2
3

# 操作

  • add() 通过增加时间来改变原始的 DateTime
  • subtract() 通过减去时间来改变原始的 DateTime

add() 参数接收的是 Duration 类型, 下面例子由原来的 0小时 新增了 1小时

Duration oneHours = Duration(hours: 1);
String date = DateTime(2020).add(oneHours).toString();
print(date);    // 2020-01-01 01:00:00.000
复制代码
1
2
3
4

subtract() 是 add() 反向操作, 用法跟 add 一致,不再阐述。

# 查询

  • isBefore
  • isAfter
  • isAtSameMomentAs
  • compareTo

isBefore 检查一个 DateTime 是否在另一个 DateTime 之前

DateTime date1 = DateTime(2020);
DateTime date2 = DateTime(2019);

print(date1.isBefore(date2));   // false
复制代码
1
2
3
4
5

isAfter 检查一个 DateTime 是否在另一个 DateTime 之后

DateTime date1 = DateTime(2020);
DateTime date2 = DateTime(2019);

print(date1.isAfter(date2));   // true
复制代码
1
2
3
4
5

isAtSameMomentAs 如果此事件与other同时发生,则返回true.

DateTime date1 = DateTime(2020);
DateTime date2 = DateTime(2019);

print(date1.isAtSameMomentAs(date2));   // false
复制代码
1
2
3
4
5

compareTo 判断2个 DateTime 是否相等,如果相等则返回 0 否则 -1

DateTime date1 = DateTime(2020);
DateTime date2 = DateTime(2020);

print(date1.compareTo(date2));   // 0
1
2
3
4
上次更新: 2022/12/11, 02:32:13
dart 数组的定义
时间 DateTime

← dart 数组的定义 时间 DateTime→

最近更新
01
Mac配置nginx+php
08-23
02
p12文件的生成
08-22
03
mac 程序安装失败解决
08-18
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Lucking | 粤ICP备2022078904号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式