C# 将时间拆分为小时块

     2023-02-24     75

关键词:

【中文标题】C# 将时间拆分为小时块【英文标题】:C# Split Times into Hour Blocks 【发布时间】:2011-09-07 23:28:57 【问题描述】:

我需要一些帮助才能将 2 个日期时间拆分为它们之间的小时间隔。

这是使用“支付”数据,因此需要非常准确。我需要打卡和打卡,并将它们分成小时间隔。

示例:

时钟 = 2011 年 5 月 25 日下午 1:40:56

下班时间 = 2011 年 5 月 25 日下午 6:22:12

我需要它看起来像:

2011 年 5 月 25 日下午 1:40:56

2011 年 5 月 25 日下午 2:00:00

2011 年 5 月 25 日下午 3:00:00

2011 年 5 月 25 日下午 4:00:00

2011 年 5 月 25 日下午 5:00:00

2011 年 5 月 25 日下午 6:00:00

2011 年 5 月 25 日下午 6:22:12

然后我计划对照“差异”表检查这些时间,看看他们应该有一个新的支付代码。但我稍后会担心支付码。

对划分时间有什么帮助吗?更喜欢 C#,但我也可以访问 MSSQL2000(这是我们拉原始时代的地方)

【问题讨论】:

我不清楚 hours 变量代表什么。它看起来像一个数组,表示长达一小时的时间跨度的开始或结束。那是你要找的吗?一般来说,使用 DateTime.AddHour 的循环似乎是一个不错的起点。 @Tobias 我清理了问题并在您回复时删除了 hours 变量:)。至于添加时间,我想我可以做到,唯一的问题是我最终必须将这些时间加在一起。所以我几乎需要将它们转换为分钟而不是我上面的建议 【参考方案1】:

这样的事情怎么样?

static IEnumerable<DateTime> GetWorkingHourIntervals(DateTime clockIn, DateTime clockOut)

    yield return clockIn;

    DateTime d = new DateTime(clockIn.Year, clockIn.Month, clockIn.Day, clockIn.Hour, 0, 0, clockIn.Kind).AddHours(1);

    while (d < clockOut)
    
        yield return d;
        d = d.AddHours(1);
    

    yield return clockOut;

这使用了iterator blocks,但它很容易被重写为返回一个列表。

使用示例:

static void Main(string[] args)

    var clockIn = new DateTime(2011, 5, 25, 13, 40, 56);
    var clockOut = new DateTime(2011, 5, 25, 18, 22, 12);

    var hours = GetWorkingHourIntervals(clockIn, clockOut);

    foreach (var h in hours)
        Console.WriteLine(h);

    Console.ReadLine();

输出:

2011-05-25 13:40:56 2011-05-25 14:00:00 2011-05-25 15:00:00 2011-05-25 16:00:00 2011-05-25 17:00:00 2011-05-25 18:00:00 2011-05-25 18:22:12

更新:LukeH 足够聪明,建议您也应该复制 DateTimeKind。如果您打算稍后将日期时间转换为本地时间,这确实是一个明智的举措。

【讨论】:

这个答案非常好,我希望我能给出 2 个答案。这是非常灵活的。但是,对于我在这个问题上的具体需求,我选择了另一个答案,主要是因为我的团队。但是这个答案很棒!【参考方案2】:
var hours = new List<DateTime>();
hours.Add(clockin);

var next = new DateTime(clockin.Year, clockin.Month, clockin.Day,
                        clockin.Hour, 0, 0, clockin.Kind);

while ((next = next.AddHours(1)) < clockout)

    hours.Add(next);

hours.Add(clockout);

【讨论】:

复制 DateTimeKind 确实是明智之举!我也会将其包含在我的答案中。 我最终选择了这条路线。尽管 Markus Olssons 的回答更灵活,但它是如此简单,我无法抗拒使用它。应该让我的队友也能理解,而且他们是新手。【参考方案3】:

我认为这样的事情应该可行:

public IEnumerable<DateTime> GetHourlyBreakdown(DateTime startDate, DateTime endDate)

    var hours = new List<DateTime>();
    hours.Add(startDate);
    var currentDate = new DateTime(startDate.Year, startDate.Month, startDate.Day, startDate.Hour, 0, 0).AddHours(1);
    while(currentDate < endDate)
    
        hours.Add(new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, currentDate.Hour, 0, 0));
        currentDate = currentDate.AddHours(1);
    
    hours.Add(endDate);
    return hours;

【讨论】:

【参考方案4】:

我会这样做:

public static IEnumerable<DateTime> GetIntervals(DateTime clockIn, DateTime clockOut)

    yield return clockIn;

    clockIn = clockIn.AddHours(1).Subtract(clockIn.TimeOfDay).AddHours(clockIn.Hour);

    for (DateTime dt = clockIn; dt < clockOut; dt = dt.AddHours(1))
        yield return dt;

    yield return clockOut;

像这样使用它:

    foreach (DateTime dt in GetIntervals(DateTime.Parse("5/25/2011 1:40:56PM", CultureInfo.InvariantCulture), DateTime.Parse("5/25/2011 6:22:12PM", CultureInfo.InvariantCulture)))
    
        Console.WriteLine(dt);
    

【讨论】:

Oracle,将持续时间行拆分为一小时

】Oracle,将持续时间行拆分为一小时【英文标题】:Oracle,splitatimedurationrowbyonehourperiod【发布时间】:2013-09-1605:40:18【问题描述】:我正在研究oracledb,但我不太擅长Oracle。我正在尝试将一行拆分一小时。例如,如果一个时间行已... 查看详情

将 CMTimeRange 拆分为多个 CMTimeRange 块

...【英文标题】:SplitCMTimeRangeintomultipleCMTimeRangechunks【发布时间】:2018-02-1413:00:16【问题描述】:假设我有一个从starttime零构造的CMTimeRange,并且duration40秒。我想通过X秒分隔符将此CMTimeRange拆分为多个块。因此,块的totalduration将... 查看详情

如何将代码块拆分为列表?

...为列表?【英文标题】:HowcanIsplitcode-blocksintoalist?【发布时间】:2016-10-2800:30:33【问题描述】:我想将CSS文件的内容拆分为代码块,并使用Python3.5将每个代码块推送到列表中。所以,鉴于这个CSS:h1color:#333,background-color:transparenth... 查看详情

将 zip 存档拆分为多个块

...多个块【英文标题】:Splitaziparchiveintomultiplechunks【发布时间】:2018-09-0521:34:15【问题描述】:我正在尝试创建一个可能很大的文件夹的zip存档。为此,我使用了pythonzipfile模块,但据我所知,没有选项可以将创建的存档拆分为具... 查看详情

拆分为逗号,而不是一个一个地对数值求和 c#

...c#【英文标题】:Splitascommathansumnumericvaluesonebyonec#【发布时间】:2014-01-2400:12:09【问题描述】:我已经尝试解决这个问题3-4小时,并在互联网上查看了许多示例。我可以用逗号分隔,但是我无法将数值逐一求和。varMyList=context.Prod... 查看详情

以秒为单位将数字拆分为天、小时、分钟和秒?

...题】:Splitdownanumberinsecondstodays,hours,minutes,andseconds?【发布时间】:2011-09-1221:47:33【问题描述】:我听说可以使用大多数编程语言中的模数%运算符来完成此操作。真正的问题是,怎么做?我不熟悉模数的工作原理,所以过去我在... 查看详情

使用c#将文本文件拆分为双字

...双字【英文标题】:Splittingtextfileintodoublewordsusingc#【发布时间】:2019-02-1618:53:45【问题描述】:我有文本文件。我想将文本分割成双字。像这样的输入:`str=IamcurrentlyenrolledinaPhDprogram输出必须是这样的:IamcurrentlyenrolledinaPhDprogram... 查看详情

将数组拆分为具有最小块大小的给定大小的块

...:Splittinganarrayupintochunksofagivensizewithaminimumchunksize【发布时间】:2020-01-1409:58:06【问题描述】:有很多将数组拆分为块的示例,例如:Splitarrayintochunks,但我也想保持每个块的最小大小,最后一个块的大小不应小于预期的最小大小... 查看详情

将一个数组拆分为 2 个数组 C#

...为2个数组C#【英文标题】:Splittinganarrayinto2arraysC#【发布时间】:2012-05-2820:31:46【问题描述】:编辑:我尝试了Take/Skip方法,但出现以下错误:Cannotimplicitlyconverttype\'System.Collections.Generic.IEnumerable<string>\'to\'string[]\'.Anexplicitco 查看详情

将 jsonarray 拆分为块数组到另一个数组中

...【英文标题】:Splitjsonarrayintochunkarraysintoanotherarray【发布时间】:2018-11-0900:41:21【问题描述】:我正在尝试将子数组拆分为3个内部数组的块。例如:[title:"asd",description:"asd",title:"asz",description:"sd",title:"ws",description:"sd", 查看详情

如何使用 REGEX 将作者拆分为对象或数组 C#?

...【英文标题】:HowToSplitAuthorswithREGEXtoobjectorarrayC#?【发布时间】:2020-01-1418:46:38【问题描述】:我正在开发一个软件,它可以读取.txt文件内容并将该内容写入msword的Sources.xml。我想将文本拆分为对象或数组(没关系)。关键是,... 查看详情

c#如何将datetime的12小时格式转换为24小时时间格式????

C#如何将DateTime的12小时格式转换为24小时时间格式????如将"2009-10-0107:52PM"转换成"2009-10-0119:52"呢??谢谢!!!看字母H的大小写,大写H是24小时,小写h是12小时。具体转换如下:stringtime=Convert.ToDateTime(date).ToSt... 查看详情

itextsharp:将文本块拆分为单词时单词被破坏

...题】:itextsharp:wordsarebrokenwhensplittingtextchunkintowords【发布时间】:2015-12-1617:30:43【问题描述】:我想突出显示一组PDF文件中的几个关键字。首先,我们必须识别单个单词并将它们与我的关键字匹配。我找到了一个例子:classMyLocati... 查看详情

C#:如何将多个字符串拆分为二维数组?

...?【英文标题】:C#:Howtosplitmultiplestringsinto2Darray?【发布时间】:2022-01-0521:29:27【问题描述】:我想根据用户输入创建一个矩阵,其中每一行都是从一串数字除以空格创建的。(一开始用户输入矩阵的大小)。示例输入:1464进入9... 查看详情

c#将字符串拆分为多维数组?

...?【英文标题】:c#Splittingstringtoamultidimensionalarray?【发布时间】:2020-01-3016:48:35【问题描述】:我遇到了一个我无法理解的小问题。我有正常的string[]数组,其中包含文本导入。每一行都单独存储在每个索引下。一行通常看起来... 查看详情

使用 webpack 将供应商库拆分为多个块

...文标题】:Splitvendorlibrariesintomultiplechunkswithwebpack【发布时间】:2016-11-2620:09:50【问题描述】:我想将我的供应商代码分成两块,一个包含所有Angular库,另一个包含其他所有内容。我的Angular应用程序只有一个入口点,并且设置如... 查看详情

使用正则表达式前瞻将信用卡号拆分为 4 块?

...标题】:Splitcreditcardnumberinto4chunksusingRegexlookahead?【发布时间】:2017-09-2002:22:21【问题描述】:我想将一个信用卡号(在我的情况下我总是有16位数字)分成4个4位数字的块。我通过积极的展望成功地做到了:vars="4581458245834584";vart... 查看详情

将 T-SQL 表值函数字符串拆分为 C#

...文标题】:ConvertT-SQLtable-valuedfunctionstringsplitintoC#【发布时间】:2019-06-0515:49:04【问题描述】:我正在尝试将T-SQL表值函数转换为c#代码。此函数通过分隔符拆分字符串。输入样本E,U7619有没有办法将逻辑转换成c#代码?我已经尝试... 查看详情