专栏首页个人路线Dart 非常详细日期的操作方法
原创

Dart 非常详细日期的操作方法

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

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

由于 DateTimeDart 内置的,所以不需要导入。

解析

  • 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

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"
  */

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

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

tryParse 的内部实现原理:

try {
  return parse(formattedString);
} on FormatException {
  return null;
}

还可以通过 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);

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

DateTime date1 = DateTime.utc(2020, 2, 22, 22, 22, 22);

取值

取得当前时间

DateTime n = DateTime.now();
print(n);   // 2020-02-20 23:05:04.332418

取得一个以毫秒时间戳

int t = DateTime.now().millisecondsSinceEpoch;
print(t);  // 1582211214849

取得一个以微秒时间戳

int t = DateTime.now().microsecondsSinceEpoch;
print(t);  // 1582211566844552

取得当前时区

String timeZone = DateTime.now().timeZoneName;
print(timeZone);

取得一周的星期几

int w = DateTime.now().weekday;
print(w);  // 4

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

Duration offset = DateTime.now().timeZoneOffset;
print(offset);    // 8:00:00.000000

取得当前年份

int year = DateTime.now().year;
print(year);      // 2020

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

int month = DateTime.now().month;
print(month);      // 2

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

int day = DateTime.now().day;
print(day);      // 21

取得当前小时 (0-23)

int hour = DateTime.now().hour;
print(hour);      // 8

取得当前分钟 (0-59)

int minute = DateTime.now().minute;
print(minute);      // 18

取得当前秒 (0-59)

int second = DateTime.now().second;
print(second);      // 18

取得当前毫秒 (0-999)

int millisecond = DateTime.now().millisecond;
print(millisecond);      // 249

取得当前微秒 (0-999)

int microsecond = DateTime.now().microsecond;
print(microsecond);      // 249

显示

  • toString
  • toIso8601String
  • toLocal
  • toUtc

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

String str = DateTime.now().toString();
print(str);     // 2020-02-22 01:01:01.182096

toIso8601String 转换成 ISO 8601

String str = DateTime.now().toIso8601String();
print(str);   // 2020-02-22T22:12:30.159729

toLocal 在本地时区返回此DateTime值

DateTime date = DateTime.now().toLocal();
print(date);   // 2020-02-22 22:27:57.641258

toUtc 在UTC时区中返回此DateTime值

DateTime date = DateTime.now().toUtc();
print(date);   // 2020-02-22 03:27:09.564188Z

操作

  • 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

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

查询

  • isBefore
  • isAfter
  • isAtSameMomentAs
  • compareTo

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

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

print(date1.isBefore(date2));   // false

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

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

print(date1.isAfter(date2));   // true

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

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

print(date1.isAtSameMomentAs(date2));   // false

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

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

print(date1.compareTo(date2));   // 0

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • moment.js日期时间管理的常用方法详细教程

    js原生获取时间,并对其格式化、计算,并不是那么的简单,moment.js的出现,对日期时间处理就方便了许多许多。

    Javanx
  • Dart语言详解(一)——详细介绍

    文档归档: https://github.com/yang0range/flutterfile

    Demo_Yang
  • Dart 2.7 发布: 更安全、更具表现力的 Dart

    上周,我们发布了 Dart 2.7 SDK 的稳定版本,它可以为开发者提供多项新功能。Dart 语言经过了充实的一年,它是一种针对客户端优化的语言,适用于在任何...

    Piper蛋窝
  • Flutter 面试知识点集锦

    谷歌大会之后,有不少人咨询了我 Flutter 相关的问题,其中有不少是和面试相关的,如今一些招聘上也开始罗列 Flutter 相关要求,最后想了想还是写一期总...

    GSYTech
  • Dart语言详解(二)——基本语法

    文档归档: https://github.com/yang0range/flutterfile

    Demo_Yang
  • Flutter 1.22 正式发布

    我们很高兴推出最新版本的Flutter,它广泛支持iOS 14和Android11。Flutter 1.22在以前版本的基础上构建,使开发人员能够从一个代码库为...

    老孟Flutter
  • Dart语言详解(一)——详细介绍

    Flutter的特性离不开Dart特别是让很多人都非常喜欢的热重载功能,很大的原因就是因为Flutter使用了Dart,那么就通过这一篇文章了解一下,我们一起了...

    Demo_Yang
  • [译]Flutter Platform Channels(二)

    Method channels是platform channels的一种,用于调用Dart和Java / Kotlin或Objective-C / Swift中...

    JarvanMo
  • python日期和时间的操作方法汇总

    日期和时间可以说是一种独特的数据类型,既不同于数字,也不同于字符串,而且有自己独特的运算规则。在不同的编程语言中,都会将日期和时间与常规的数据类型独立开来,单独...

    生信修炼手册
  • 同时搞定Android和iOS的Dart语言(1):Dart初探

    用Flutter开发Android App和iOS App需要使用Dart语言,所以本系列文章会深入介绍Dart语言的相关知识,后续还会推出Flutter Ap...

    蒙娜丽宁
  • Flutter之旅:Dart语法扫尾-包访问-泛型--异常-异步-mixin

    张风捷特烈
  • Dart语法详解(三)——进阶篇

    在上一篇文章,我们详细的介绍了Dart语法的一些基本语法,这一这篇文章,我们继续介绍Dart的语法的相关知识。

    Demo_Yang
  • Dart语法详解(三)——进阶篇

    在上一篇文章,我们详细的介绍了Dart语法的一些基本语法,这一这篇文章,我们继续介绍Dart的语法的相关知识。

    Demo_Yang
  • 【老孟Flutter】Flutter 2 新增的功能

    今天,我们很高兴地宣布Flutter 2的发布。距离Flutter 1.0的发布已经两年多了,但是在很短的时间内,我们已经关闭了24,541期,并合并了765个...

    老孟Flutter
  • 【译】Flutter 1.20 发布

    谷歌对 Flutter 的定位是提供一个便捷的工具包,从而在任何设备上得到出色的绘制体验,所以对于每个 release 版本,将会努力确保 Flutter 能快...

    GSYTech
  • 前端技术观察第22期

    Fastify 3.0: A Fast 'Low-Overhead' Web Framework for Node

    ConardLi
  • Dart语言指南(一) 顶

    此文着重展示如何使用Dart语言的每一个主要功能,从变量和操作符到类和库,假设您已经知道如何用另一种编程语言。

    南郭先生
  • Dart语言详解(二)——基本语法

    之前,详细的介绍了一下Dart语言的前世今生,接下来,我们就该深入的了解Dart语言,了解Dart语言的基本数据类型,语法等相关的内容

    Demo_Yang
  • 【Flutter】372- Flutter移动端实战手册

    Flutter又双叒叕来了!本周推送是我们Flutter系列文章的最终篇!《Flutter移动端实战手册》回归实际应用场景,详细讲述Flutter在移动端的应用...

    pingan8787

扫码关注云+社区

领取腾讯云代金券