C# DateTime 求兩個時間範圍的問題

weixin_44220506 2021-04-01 01:12:25
大家好, 假設我有兩個DateTime,數值是隨機的。 例如:2018-08-06 07:08:00及2020-10-01 19:49:00 希望透過就算得到以下數個時間區段: 2018-08-06 07:08:00~2018-08-06 08:00:00(以分鐘) 2018-08-06 08:00:00~2018-08-07 00:00:00(以小時) 2018-08-07 00:00:00~2018-09-01 00:00:00(以天) 2018-09-01 00:00:00~2019-01-01 00:00:00(以月) 2019-01-01 00:00:00~2020-01-01 00:00:00(以年) 2020-01-01 00:00:00~2020-10-01 00:00:00(以月) 2020-10-01 00:00:00~2020-10-01 19:00:00(以小時) 2020-10-01 19:00:00~2020-10-01 19:49:00(以分鐘) 想請問該如何撰寫通用的寫法呢⋯ 想破頭了⋯
...全文
2410 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
调用现成函数很简单,除非要自己写处理函数才用判断处理.
  • 打赏
  • 举报
回复
其实时差天差可归结为分钟,月差年差可归结为时差,当然总的可归结为分钟差都是可以的不过是算术问题而已.
  • 打赏
  • 举报
回复
还在纠结?看图,第二个时间就不写了,因为同样处理语句.
six2me 2021-04-06
  • 打赏
  • 举报
回复
又翻回去看来看你的题目,还是没明白,不就是计算时间差吗,上面我的回答也仅是提示了一种方法。
weixin_44220506 2021-04-06
  • 打赏
  • 举报
回复
引用 14 楼 Six-Classics-note-Me 的回复:
DateTime dateEnd= new DateTime(2020,10,1,19,49,00);
DateTime dateBegin = new DateTime(2018,8,6,7,8,0);
tsEnd = new TimeSpan(dateEnd.Ticks);
tsBegin = new TimeSpan(dateBegin.Ticks);
TimeSpan ts = tsBegin.Subtract(tsEnd).Duration();
string ret = "";
ret = ts.TotalSeconds.ToString();//得到秒
ret = ts.TotalMilliseconds.ToString();//得到毫秒
//得到时分秒
string hours = ts.TotalHours.ToString();
string minutes = ts.TotalMinutes.ToString();
string seconds = ts.TotalSeconds.ToString();
if (ts.TotalHours < 10)
hours = "0" + hours;
if (ts.TotalMinutes < 10)
minutes = "0" + minutes;
if (ts.TotalSeconds < 10)
seconds = "0" + seconds;
ret = hours + ":" + minutes + ":" + seconds;
//其他自己写


這和我的問題好像是不一樣的目的…
weixin_44220506 2021-04-06
  • 打赏
  • 举报
回复
引用 12 楼 jhonsonzhang 的回复:
datediff,就这么简单。计算结果按要求进行时间格式。


使用orm,非sql語法,使用的orm沒有datediff支援,
需要從程式語法先行分類。
weixin_44220506 2021-04-06
  • 打赏
  • 举报
回复
引用 10 楼 morliz子轩 的回复:
[quote=引用 9 楼 weixin_44220506 的回复:]

不同时区,就是按这个[取值类型]来进行分组统计了。如果还要按日期分组,就是 日期 +类型,进行分组统计了。这有什么困难的?


和您說明一下,
1.假設需要時間範圍2021-03-05 08:00:00-2021-03-05 17:00:00的每小時長條圖,的確是可以直接取【小時統計】的數據表即可。
2.時間範圍2018-08-06 07:08:00及2020-10-01 19:49:00混雜了分、時、日、月、年的情況,需要分開至不同的數據表拿取資料,現在困擾我的是該如何拆分日期時間…

p.s. 【分鐘統計】數據表的數據,每小時會將這個小時內(例如: 2021-03-05 08:00:00-2021-03-05 09:00:00)的數據加總並存到【小時統計】數據表。【小時統計】數據表在每天凌晨12時會將本日(例如:2021-03-05 00:00:00-2021-03-06 00:00:00)的數據加總並存至【日統計】數據表… 月、年亦同。[/quote]

需求中两个细节:
1、你要抓取的数据来源:
如果不是同一天,需要抓取的数据到统计表(跨年、跨月、跨天、跨时、跨分)
也就是要做5次条件判断,而不取决于这个所谓的类型去判断。

这5个条件判断是这样的:(如上表结构,直接都归成DateTime类型,不要起始时间和截止时间字段)

//判断跨年
string BegYear = BegDate.Year.ToString();
string EndYear = EndDate.Year.ToString();
if(EndYear > BegYear)
{
//do something
}

//判断跨月
string BegMonth = BegDate.Month.ToString();
string EndMonth = EndDate.Month.ToString();
if(EndMonth > BegMonth)
{
//do something
}

//判断跨时
string BegHour =BegDate.Hour.ToString();
string EndHour =EndDate.Hour.ToString();
if(BegHour > EndHour )
{
//do something
}

//判断跨分
string BegMinute =BegDate.Minute.ToString();
string EndMinute =EndDate.Minute.ToString();
if(BegMinute > EndMinute )
{
//do something
}



这是一个基本判断的逻辑,当然具体的业务场景如果这5种条件,它都具备,那也就是要都去处理获取的数据写入相应不同的数据表中。
也可能出现,同年、同月,不同天的,或者同年不同月、不同天的。这就需要在if层里多加几层子if去做细节化处理。[/quote]

參考

引用 10 楼 morliz子轩 的回复:
[quote=引用 9 楼 weixin_44220506 的回复:]

不同时区,就是按这个[取值类型]来进行分组统计了。如果还要按日期分组,就是 日期 +类型,进行分组统计了。这有什么困难的?


和您說明一下,
1.假設需要時間範圍2021-03-05 08:00:00-2021-03-05 17:00:00的每小時長條圖,的確是可以直接取【小時統計】的數據表即可。
2.時間範圍2018-08-06 07:08:00及2020-10-01 19:49:00混雜了分、時、日、月、年的情況,需要分開至不同的數據表拿取資料,現在困擾我的是該如何拆分日期時間…

p.s. 【分鐘統計】數據表的數據,每小時會將這個小時內(例如: 2021-03-05 08:00:00-2021-03-05 09:00:00)的數據加總並存到【小時統計】數據表。【小時統計】數據表在每天凌晨12時會將本日(例如:2021-03-05 00:00:00-2021-03-06 00:00:00)的數據加總並存至【日統計】數據表… 月、年亦同。[/quote]

需求中两个细节:
1、你要抓取的数据来源:
如果不是同一天,需要抓取的数据到统计表(跨年、跨月、跨天、跨时、跨分)
也就是要做5次条件判断,而不取决于这个所谓的类型去判断。

这5个条件判断是这样的:(如上表结构,直接都归成DateTime类型,不要起始时间和截止时间字段)

//判断跨年
string BegYear = BegDate.Year.ToString();
string EndYear = EndDate.Year.ToString();
if(EndYear > BegYear)
{
//do something
}

//判断跨月
string BegMonth = BegDate.Month.ToString();
string EndMonth = EndDate.Month.ToString();
if(EndMonth > BegMonth)
{
//do something
}

//判断跨时
string BegHour =BegDate.Hour.ToString();
string EndHour =EndDate.Hour.ToString();
if(BegHour > EndHour )
{
//do something
}

//判断跨分
string BegMinute =BegDate.Minute.ToString();
string EndMinute =EndDate.Minute.ToString();
if(BegMinute > EndMinute )
{
//do something
}



这是一个基本判断的逻辑,当然具体的业务场景如果这5种条件,它都具备,那也就是要都去处理获取的数据写入相应不同的数据表中。
也可能出现,同年、同月,不同天的,或者同年不同月、不同天的。这就需要在if层里多加几层子if去做细节化处理。[/quote]

您好,參考版友-智者知已应修善业的建議,我將個別函數分成幾塊,節錄分鐘和小時的部份如下(為了方便先強制返回兩組時間範圍,一組是前面找到的範圍,一組是後面找到的範圍。有可能時間範圍是無效的,故意找不到資料),但是我覺得我弄得好混亂…

        public List<DateTimeCombine> GetMinuteModelList(DateTime dtStart, DateTime dtEnd)
{

DateTime dtFrontStart = dtStart;
DateTime dtFrontEnd = dtStart;
DateTime dtBackStart = dtEnd;
DateTime dtBackEnd = dtEnd;

//TimeSpan ts = new TimeSpan(dtEnd.Ticks - dtStart.Ticks);

int stMinuteStart = 60 - dtFrontStart.Minute;

if (stMinuteStart == 60)
{
dtFrontStart = dtFrontStart.AddSeconds(1);
dtFrontEnd = dtFrontStart;
}
else
{
dtFrontEnd = dtFrontEnd.AddMinutes(stMinuteStart);

if (dtFrontEnd > dtEnd)
dtFrontEnd = dtEnd;
}

DateTimeCombine dtCombinFront = new DateTimeCombine
{
dtStartTime = dtFrontStart,
dtEndTime = dtFrontEnd
};

int stMinuteEnd = dtBackEnd.Minute - 0;

if (stMinuteEnd == 0)
{
dtBackEnd = dtBackStart.AddSeconds(-1);
dtBackStart = dtBackEnd;
}
else
{
stMinuteEnd = 0 - stMinuteEnd;
dtBackStart = dtBackStart.AddMinutes(stMinuteEnd);

if (dtBackStart < dtStart)
dtBackStart = dtStart;
}

DateTimeCombine dtCombinBack = new DateTimeCombine
{
dtStartTime = dtBackStart,
dtEndTime = dtBackEnd
};

List<DateTimeCombine> data = new List<DateTimeCombine>();

data.Add(dtCombinFront);
data.Add(dtCombinBack);

return data;
}

public List<DateTimeCombine> GetHourModelList(DateTime dtStart, DateTime dtEnd)
{

DateTime dtFrontStart = dtStart;
DateTime dtFrontEnd = dtStart;
DateTime dtBackStart = dtEnd;
DateTime dtBackEnd = dtEnd;

int stHourStart = 24 - dtFrontStart.Hour;

if(dtStart.Year == dtEnd.Year && dtStart.Month == dtEnd.Month && dtStart.Day == dtEnd.Day)
{
if(dtStart.Hour == dtEnd.Hour)
{
dtFrontStart = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, dtStart.Hour, 1, 0);
dtFrontEnd = dtFrontStart;
}
else
{
dtFrontEnd = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, dtStart.Hour, 0, 0);
}
}
else
{
dtFrontEnd = dtFrontEnd.AddHours(stHourStart);
dtFrontEnd = new DateTime(dtFrontEnd.Year, dtFrontEnd.Month, dtFrontEnd.Day, dtFrontEnd.Hour, 0, 0);
}

DateTimeCombine dtCombinFront = new DateTimeCombine
{
dtStartTime = dtFrontStart,
dtEndTime = dtFrontEnd
};

int stHourEnd = dtBackEnd.Hour - 0;


if (dtStart.Year == dtEnd.Year && dtStart.Month == dtEnd.Month && dtStart.Day == dtEnd.Day)
{
if (dtStart.Hour == dtEnd.Hour)
{
dtBackStart = new DateTime(dtEnd.Year, dtEnd.Month, dtEnd.Day, dtEnd.Hour, 1, 0);
dtBackEnd = dtBackStart;
}
else
{
dtBackEnd = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, dtStart.Hour, 0, 0);
}
}
else
{
stHourEnd = 0 - stHourEnd;
dtBackStart = dtBackStart.AddHours(stHourEnd);
dtBackStart = new DateTime(dtBackStart.Year, dtBackStart.Month, dtBackStart.Day, dtBackStart.Hour, 0, 0);


if (dtBackStart < dtStart)
dtBackStart = dtStart;
}

DateTimeCombine dtCombinBack = new DateTimeCombine
{
dtStartTime = dtBackStart,
dtEndTime = dtBackEnd
};

List<DateTimeCombine> data = new List<DateTimeCombine>();

data.Add(dtCombinFront);
data.Add(dtCombinBack);

return data;
}
enaking 2021-04-06
  • 打赏
  • 举报
回复
TimeSpan本身就有这些属性,以分以小时以天以月计数。你.然后看属性就知道了。
morliz子轩 2021-04-06
  • 打赏
  • 举报
回复
逻辑上的整理,大至有以下5条线: 年份差异; 月份差异; 天数差异; 小时差异; 分钟差异; 先搞清楚,当年月有差异时,要不要比较天数和小时、分钟数的差异。 如果需要比较要分门写入指定的表中,那就将上面的分块方法,组合写一个区块链方法(调用那些小方法),这样成套的逻辑就贯穿出来了。
morliz子轩 2021-04-06
  • 打赏
  • 举报
回复
引用 19 楼 weixin_44220506 的回复:
您好,參考版友-智者知已应修善业的建議,我將個別函數分成幾塊,節錄分鐘和小時的部份如下(為了方便先強制返回兩組時間範圍,一組是前面找到的範圍,一組是後面找到的範圍。有可能時間範圍是無效的,故意找不到資料),但是我覺得我弄得好混亂…
先要搞清楚,有几组逻辑。而不是纠结有几种写法。 搞通一组逻辑 就写到方法里去,一组一组来。 最后把逻辑整理成多个区块,这样思路就清晰了。 逻辑有几条线都没整理好,你又怎么去搞这个方法的封装呢。
weixin_42066565 2021-04-02
  • 打赏
  • 举报
回复
回帖test
six2me 2021-04-02
  • 打赏
  • 举报
回复
DateTime dateEnd= new DateTime(2020,10,1,19,49,00); DateTime dateBegin = new DateTime(2018,8,6,7,8,0); tsEnd = new TimeSpan(dateEnd.Ticks); tsBegin = new TimeSpan(dateBegin.Ticks); TimeSpan ts = tsBegin.Subtract(tsEnd).Duration(); string ret = ""; ret = ts.TotalSeconds.ToString();//得到秒 ret = ts.TotalMilliseconds.ToString();//得到毫秒 //得到时分秒 string hours = ts.TotalHours.ToString(); string minutes = ts.TotalMinutes.ToString(); string seconds = ts.TotalSeconds.ToString(); if (ts.TotalHours < 10) hours = "0" + hours; if (ts.TotalMinutes < 10) minutes = "0" + minutes; if (ts.TotalSeconds < 10) seconds = "0" + seconds; ret = hours + ":" + minutes + ":" + seconds; //其他自己写
morliz子轩 2021-04-02
  • 打赏
  • 举报
回复
引用 12 楼 jhonsonzhang 的回复:
datediff,就这么简单。计算结果按要求进行时间格式。
说到了痛点上,
韧翅凌空 2021-04-02
  • 打赏
  • 举报
回复
学习学习,厉害厉害!!!!!!!!!!!!!!!!
luj_1768 2021-04-02
  • 打赏
  • 举报
回复
2020-10-01, 1949/ 2018-08-06, 07-08-00? 老兄是想说点什么呢?这个算法可能需要造个对照表,然后用查表法解答。
a6165493 2021-04-02
  • 打赏
  • 举报
回复
学习了多谢楼主
weixin_44220506 2021-04-01
  • 打赏
  • 举报
回复
引用 8 楼 morliz子轩 的回复:
[quote=引用 5 楼 weixin_44220506 的回复:][quote=引用 2 楼 morliz子轩 的回复:][quote=引用 楼主 weixin_44220506 的回复:]大家好,

假設我有兩個DateTime,數值是隨機的。

例如:2018-08-06 07:08:00及2020-10-01 19:49:00

希望透過就算得到以下數個時間區段:
2018-08-06 07:08:00~2018-08-06 08:00:00(以分鐘)
2018-08-06 08:00:00~2018-08-07 00:00:00(以小時)
2018-08-07 00:00:00~2018-09-01 00:00:00(以天)
2018-09-01 00:00:00~2019-01-01 00:00:00(以月)
2019-01-01 00:00:00~2020-01-01 00:00:00(以年)
2020-01-01 00:00:00~2020-10-01 00:00:00(以月)
2020-10-01 00:00:00~2020-10-01 19:00:00(以小時)
2020-10-01 19:00:00~2020-10-01 19:49:00(以分鐘)

想請問該如何撰寫通用的寫法呢⋯
想破頭了⋯


首先,是定义一个数据结构表:
BegDate(起始日期) 、EndDate(截止日期)、BegTime(起始时间)、EndTime(截止时间)、dtType(取值类型)
dtType 枚举定义:
minutes= 0,
hours =1,
day=2,
month=3,
years=4

最后,建议的表结构是这样的:

起始日期 截止日期 起始时间 截止时间 取值类型
2020-10-01 2020-10-01 19:00:00 19:49:00 1

这样的DataTable或List集,就可以很好的做逻辑运算。[/quote]

謝謝您的耐心回覆,因為另外需依不同類型(分、時、日、月、年)的時間區段呈現加總長條圖(已完成),
所以目前我是將分、時、日、月、年的加總數據預先處理並分別存在不同的報表。

目前是打算用Union將各表結合,且GroupBy將分、時、日、月、年的數據取出。
所以才需要將上述的2018-08-06 07:08:00及2020-10-01 19:49:00範圍拆分成數個…
然後再依拆出來的範圍用where限制各表的範圍。

不曉得是否有更好的作法呢? 謝謝您。[/quote]

不同时区,就是按这个[取值类型]来进行分组统计了。如果还要按日期分组,就是 日期 +类型,进行分组统计了。这有什么困难的?[/quote]

和您說明一下,
1.假設需要時間範圍2021-03-05 08:00:00-2021-03-05 17:00:00的每小時長條圖,的確是可以直接取【小時統計】的數據表即可。
2.時間範圍2018-08-06 07:08:00及2020-10-01 19:49:00混雜了分、時、日、月、年的情況,需要分開至不同的數據表拿取資料,現在困擾我的是該如何拆分日期時間…

p.s. 【分鐘統計】數據表的數據,每小時會將這個小時內(例如: 2021-03-05 08:00:00-2021-03-05 09:00:00)的數據加總並存到【小時統計】數據表。【小時統計】數據表在每天凌晨12時會將本日(例如:2021-03-05 00:00:00-2021-03-06 00:00:00)的數據加總並存至【日統計】數據表… 月、年亦同。
morliz子轩 2021-04-01
  • 打赏
  • 举报
回复
引用 5 楼 weixin_44220506 的回复:
[quote=引用 2 楼 morliz子轩 的回复:][quote=引用 楼主 weixin_44220506 的回复:]大家好, 假設我有兩個DateTime,數值是隨機的。 例如:2018-08-06 07:08:00及2020-10-01 19:49:00 希望透過就算得到以下數個時間區段: 2018-08-06 07:08:00~2018-08-06 08:00:00(以分鐘) 2018-08-06 08:00:00~2018-08-07 00:00:00(以小時) 2018-08-07 00:00:00~2018-09-01 00:00:00(以天) 2018-09-01 00:00:00~2019-01-01 00:00:00(以月) 2019-01-01 00:00:00~2020-01-01 00:00:00(以年) 2020-01-01 00:00:00~2020-10-01 00:00:00(以月) 2020-10-01 00:00:00~2020-10-01 19:00:00(以小時) 2020-10-01 19:00:00~2020-10-01 19:49:00(以分鐘) 想請問該如何撰寫通用的寫法呢⋯ 想破頭了⋯
首先,是定义一个数据结构表: BegDate(起始日期) 、EndDate(截止日期)、BegTime(起始时间)、EndTime(截止时间)、dtType(取值类型) dtType 枚举定义: minutes= 0, hours =1, day=2, month=3, years=4 最后,建议的表结构是这样的: 起始日期 截止日期 起始时间 截止时间 取值类型 2020-10-01 2020-10-01 19:00:00 19:49:00 1 这样的DataTable或List集,就可以很好的做逻辑运算。[/quote] 謝謝您的耐心回覆,因為另外需依不同類型(分、時、日、月、年)的時間區段呈現加總長條圖(已完成), 所以目前我是將分、時、日、月、年的加總數據預先處理並分別存在不同的報表。 目前是打算用Union將各表結合,且GroupBy將分、時、日、月、年的數據取出。 所以才需要將上述的2018-08-06 07:08:00及2020-10-01 19:49:00範圍拆分成數個… 然後再依拆出來的範圍用where限制各表的範圍。 不曉得是否有更好的作法呢? 謝謝您。[/quote] 不同时区,就是按这个[取值类型]来进行分组统计了。如果还要按日期分组,就是 日期 +类型,进行分组统计了。这有什么困难的?
weixin_44220506 2021-04-01
  • 打赏
  • 举报
回复
引用 6 楼 wtnu200 的回复:
用tostring取得对应时间格式来判断
比如 time.Tostring("ss")=="00"
写个函数,传入两个时间进行运算


不太理解您的意思,可以再多說明些嘛?
謝謝了
wtnu200 2021-04-01
  • 打赏
  • 举报
回复
用tostring取得对应时间格式来判断 比如 time.Tostring("ss")=="00" 写个函数,传入两个时间进行运算
加载更多回复(8)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧