第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)
一. 时间的类型
1. 背景
这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式介绍Quartz.Net之前,还是很有必要补充一下的,该章节就是解决这类问题的。
2. 时间类型
时间类型主要有两类:DateTime和DateTimeOffset
(详情参考:https://docs.microsoft.com/zh-cn/dotnet/standard/datetime/choosing-between-datetime)
(1). DateTime:表示的时区有限,国内采用这个时间。
(2). DateTimeOffset:可以表示任何时区,通过偏移量来控制。(Quartz中提供DateBuilder类来实现DateTimeOffset类型)
3. 类型转换
(1). DateTime→DateTimeOffset 利用DateTimeOffset的构造函数
(2). DateTimeOffset→DateTime 利用Convert.ToDateTime方法
下面分享一段两种类型相互转换的代码:
// DateTime类型
DateTime date1 = DateTime.Parse("2018-01-01 11:45:30");
//DateTimeOffset类型
DateTimeOffset date3 = DateBuilder.DateOf(, , , , , );
//1. DateTime 转换成 DateTimeOffset
DateTimeOffset date16 = new DateTimeOffset(date1, TimeSpan.Zero);
//2. DateTimeOffset 转换成 DateTime
DateTime date17 = Convert.ToDateTime(date3);
二. 各种模式的表示
(一). 定点模式
1. 需求:
a. 2018-01-01 11:45:30
b. 01-01 1:45:30
c. 1:45:30
2. 解决方案
(1). DateTime类
a. 利用DateTime.Parse()进行转换,如:DateTime.Parse("2018-01-01 11:45:30");
b. 利用DateTime类丰富的构造函数来执行, 如:new DateTime(2018, 1, 1, 11, 45, 30);

(2). DateTimeOffset类
a. 利用DateBuilder.DateOf()进行转换,如:DateBuilder.DateOf(11, 45, 30, 1, 1, 2018);

b. 利用DateTimeOffset类丰富的构造函数来执行, 如: new DateTimeOffset(2018, 1, 1, 11, 45, 30, TimeSpan.Zero);

c. 另外,DateBuilder类还提供 TodayAt和TomorrowAt类,便于在当前年月日的基础上进行处理
代码分享:
DateTime date1 = DateTime.Parse("2018-01-01 11:45:30");
DateTime date2 = new DateTime(, , , , , );
DateTimeOffset date3 = DateBuilder.DateOf(, , , , , );
DateTimeOffset date4 = new DateTimeOffset(, , , , , , TimeSpan.Zero);
//默认为当前年月日
DateTimeOffset date5 = DateBuilder.TodayAt(, , );
//默认为当前年月日的基础上 + 1天
DateTimeOffset date6 = DateBuilder.TomorrowAt(, , );
(二). 四舍五入的模式
1. 需求:1:45:30 → 2:00:00
→ 1:00:00
2. 解决方案:
(1).DateBuilder.EvenHourDate 在小时的基础上进行“入”
(2).DateBuilder.EvenHourDateBefore 在小时的基础上进行“舍”
(3).另外在分钟的基础上进行入和舍有: EvenMinuteDate和EvenMinuteDateBefore
在秒钟的基础上进行入和舍有: EvenSecondDate和EvenSecondDateBefore
代码分享:
DateTimeOffset date5 = DateBuilder.TodayAt(, , );
DateTimeOffset date7 = DateBuilder.EvenHourDate(date5); //当前年月日下:2:00:00
DateTimeOffset date8 = DateBuilder.EvenHourDateBefore(date5); //当前年月日下:1:00:00
(三). 倍数模式(不常用)
1. 包括:NextGivenMinuteDate和NextGivenSecondDate
以NextGivenMinuteDate为例,说明它的用法,NextGivenSecondDate与他类似
查看源码:public static DateTimeOffset NextGivenMinuteDate(DateTimeOffset? date, int minuteBase);
第一个参数:可以为空,也可以指定时间
第二个参数:把一个小时按minuteBase分钟进行划分,也就是60/minuteBase等份,真正的运行时间所在区间的下一个minuteBase分钟运行,
(PS:比如minuteBase=20,那么就是将分钟划分为3等分,分别是:20、40、60, 比如现在分钟是在 0-19分59秒,任何一个都会变为 20分00秒)
2. 用法:第一个参数为空的话,取的是当前时间为依据。
第一个参数有值的话,是以第一个参数为依据。
代码分享:
//以当前时间为依据,假设当前时间为:14:43:29 d9=14:50:00 d10=15:00:00
DateTimeOffset d9 = DateBuilder.NextGivenMinuteDate(null, );
DateTimeOffset d10 = DateBuilder.NextGivenMinuteDate(null, );
//以第一个参数为依据
DateTimeOffset date9 = DateBuilder.NextGivenMinuteDate(DateBuilder.TodayAt(, , ), ); //50分 秒数为0
DateTimeOffset date10 = DateBuilder.NextGivenMinuteDate(new DateTime(, , , , , ), ); //40分 秒数为0
(四). 递增模式
1. 需求:解决在某个时间点上增加:秒、分、分钟、小时、或天、月等。
2. 解决方案:
利用DateTime类中的各种Add函数来解决。
常用方法有:AddSeconds、AddMinutes、AddHours、AddDays、AddMonths
代码分享:
DateTime date1 = DateTime.Parse("2018-01-01 11:45:30");
DateTime date11 = date1.AddSeconds(); //2018-01-01 11:45:31
DateTime date12 = date1.AddMinutes(); //2018-01-01 11:46:30
DateTime date13 = date1.AddHours(); //2018-01-01 12:45:30
DateTime date14 = date1.AddDays(); //2018-01-02 11:45:30
DateTime date15 = date1.AddMonths(); //2018-02-01 11:45:30

第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)的更多相关文章
- SQL Server两种分页的存储过程介绍
由于现在很多的企业招聘的笔试都会让来招聘的写一个分页的存储过程,有的企业甚至要求应聘者用两种方式实现分页,如果没有在实际项目中使用过分页,那么很多的应聘者都会出现一定的问题,下面介绍两种分 ...
- java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)
当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...
- 两种常量类型-readonly和const
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...
- 列举两种不同类型的Java标识注释,并解释它们之间的区别。
列举两种不同类型的Java标识注释,并解释它们之间的区别.
- ElasticSearch 学习记录之Text keyword 两种基本类型区别
ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...
- Java中的两种异常类型及其区别?
Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...
- 修改linux 两种时间的方法
1,整理了一下怎么修改linux 两种时间的方法. 硬件时间:hwclock 或者clock,设置的方法是 hwclock --set --date="05/12/2018 12:30:50 ...
- 关于datetime,date,timestamp,year,time时间类型小结
关于datetime,date,timestamp,year,time时间类型 datetime占用8个字节 日期范围:”1000-01-01 00:00:00” 到”9999-12-31 23:59 ...
- Spring的IOC逐层深入——依赖注入的两种实现类型
构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...
随机推荐
- adb.exe 安卓测试桥的使用
一.android SDK提供了几个工具 (在SDK下build-tools目录下的工具) dx.bat ----------->把java编译器编译生成的.class 文件 ,变成一个文件,让 ...
- es crul查询(一)
C:\Users\Administrator>elasticdump --input=D:\test --output=http://localhost:9200/logs_apipki_201 ...
- 【笔记】基于Python的数字图像处理
[博客导航] [Python相关] 前言 基于Python的数字图像处理,离不开相关处理的第三方库函数.搜索网络资源,列出如下资源链接. Python图像处理库到底用哪家 python计算机视觉编程— ...
- css实现单行(多行)文本溢出显示 ...
overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 当然还需要加宽度width属来兼容部分浏览. 以上为单行文本溢出===== ...
- auth模块用户认证
一.auth模块什么 auth模块时django自带的用户认证模块 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功 ...
- 本文详解5G是个什么鬼,程序员都准备好了吗?
无线移动通讯发展历史 最近5G的概念炒的如火如荼,为此,华为和高通还干了一仗.这篇文章从技术层面给大家分析,什么是5G,它和4G比,高级在哪里? 我们来看看移动互联网的技术发展: 然后我们在来看看他们 ...
- Winform让扫描枪听话,防止在有焦点的地方就扫码输入的尴尬
关注点: 1.扫描枪在扫描到条码后会在有焦点的地方显示扫描到的条码并且可设置扫码后添加回车换行让我很尴尬 2.怎样拦截扫码输入,扫描到条码就自动会嘀一声.不要这么智能行不行.瞎BB 需求详解 公司生产 ...
- MySQL中的float和decimal类型有什么区别
decimal 类型可以精确地表示非常大或非常精确的小数.大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性.该类型对于必须避免舍入错误的应用程序( ...
- DAY10、函数的参数
一.实参:为形参传递值 调用函数时,实参可以由常量,变量,表达式三种的组合 1.位置实参:必须按照位置的顺序,从左到右为形参传递值 fn1(10, 20, 30) fn1(30, 20, 10) 2. ...
- nginx(三)反向代理和负载均衡
nginx(三)反向代理和负载均衡 正向代理概念:比如在学校要上网,在学校内网是一个内网ip,需要连上公网就需要一个正向代理服务器. 反向代理概念: 看下图(Nginx只做请求的转发,后台有多个htt ...