计算一整天c#

时间:2011-03-03 14:53:59

标签: c#

这是为了解决办公室对一整天所构成的意见的不同。

代表一整天(到第二天)我会说:

2011/03/03 00:00:00 - 2011/03/04 00:00:00 =一整天。

例如:

TimeSpan test = new DateTime(2011, 03, 04, 00, 00, 00) - new DateTime(2011, 03, 03, 00, 00, 00); 

以上代码的测试值为1.00:00:00,因此需要一整天。

办公室的其他意见:

2011/03/03 00:00:00 - 2011/03/03 23:59:59 =一整天。

如果有人可以打扰回复这个!!他们认为哪个是正确的?

编辑:

几个月过去了,办公室里有“其他意见”的两个人不再在这里工作了......

15 个答案:

答案 0 :(得分:36)

你想要一天,请求一天:

TimeSpan oneDay = TimeSpan.FromDays(1);

区间[2011/03/03 00:00:00,2011 / 03/04 00:00:00 [跨越一整天。请注意,上限是打开的。如果您的粒度不小于一秒,那么该间隔与[2011/03/03 00:00:00,2011 / 03/03 23:59:59](封闭上限)完全相同。希望这可以清除这两种观点。

你也可以说你正在思考瞬间,你的同事正在思考一秒钟的时间。想象一下,用几根木杆构成一个长栅栏,每对连续的电线杆用一串相同长度的电线连接起来。您可以说栅栏从极点0到极点10,您的同事可以说栅栏从字符串0到字符串9。

根据您的尝试,两种观点都可以正确。在需要另一个的情况下使用其中一个观点是fencepost error

答案 1 :(得分:14)

一整天包含86400秒。

DateTime start = new DateTime(2011, 3, 3, 0, 0, 0);
DateTime earlyEnd = new DateTime(2011, 3, 3, 23, 59, 59);
Console.WriteLine((earlyEnd - start).TotalSeconds); // prints 86399

DateTime lateEnd = new DateTime(2011, 3, 4, 0, 0, 0);
Console.WriteLine((lateEnd - start).TotalSeconds); // prints 86400

这里令人困惑的部分是DateTime代表一个确切的瞬间。今天的一整天从3月3日00:00的时刻开始,直到时间变​​成3月4日00:00的那一刻。瞬间没有任何长度,但我认为我们的思绪有些麻烦考虑时间,但同时又不给它任何长度。

从更哲学的角度来看,我们或许可以说上面的代码示例将计算从某一秒的开始开始的时间。另一秒钟。这清楚地表明,第一秒包含在计算的时间跨度中,但最后一秒不包括在内。

答案 2 :(得分:4)

一天是24小时。一天不是23小时59分59秒。

答案 3 :(得分:4)

一天中的最后一刻是在午夜减去可测量的最小时间增量。由您来定义,当您将其格式化为字符串时,它将是第二个。对于操作系统,它将是1/64秒。在NIST的原子钟上,它将只是皮秒的一小部分。

DateTime结构为100纳秒。

答案 4 :(得分:3)

第一个选项是正确的,因为你错过了第二个选项中第二天23:59:59和0:00:00之间的第二个选项......

有些人可能会采取第二种选择,以明确表示必须显示3月3日的日期。但是,在这种情况下,23:59:59,99也属于当天(在很多软件中它将显示为23:59:59),依此类推。所以,最后,这再次收敛到第一个选项;)

答案 5 :(得分:3)

您和您的同事正在从两个不同的角度处理问题,从您个人的角度来看,您是对的。

一整天是86,400秒。这一天涵盖2011-03-02 00:00:00至2011-03-02 23:59:59的范围。那是86,400秒。但是要计算一天的跨度,您必须从2011-03-03 00:00:00减去2011-03-02 00:00:00。

这与说[0-9]范围包含10个项目没有什么不同。但如果你从9中减去0就得到9.嗯?哦,是的,如果你想计算一个范围内有多少项,你必须从结束范围值中减去起始范围值,然后加一个。

答案 6 :(得分:2)

显然,如果第一种方法返回1.00:00:00而第二种方法返回0.23:59:59则第一种方法是正确的(它显示 1天,而第二种方法小于1天)

答案 7 :(得分:1)

这是一个有趣的问题。我想答案取决于你的申请。如果你使用第一种方法,你将计算两次。

答案 8 :(得分:1)

每小时59分钟?一天23小时59分59秒?

那就是说,我知道为什么你的同事有这样的意见。日期比较很棘手。

答案 9 :(得分:0)

尽量不要将其视为时间,而不是数字。

您的问题是关于2 - 12.0 - 0.9。你能指望什么?
这是一年级的简单的基础初等数学

答案 10 :(得分:0)

作为旁注,如果您想要特定日的时间间隔,请注意并非所有日期都有24小时。

有些日子有leap seconds,这会使它们延长一秒。

夏令时变化使得天​​数达到23或25小时(取决于变化)。

答案 11 :(得分:0)

一天是某个持续时间(即24小时,或1440分钟或86.400秒)。此持续时间以.NET表示,数据类型为TimeSpan

另一方的数据类型DateTime表示某个及时没有持续时间。

持续时间可以在两个时间点之间测量,因此2011/03/03 0:00和2011/03/04 0:00之间的持续时间恰好是一天,而持续时间是2011/03/03 0 :00和2011/03/03 23:59:99是一天不到一天。

将此与长度进行比较:如果您沿着距离1米的线定义点并用“1”,“2”,“3”,......标记它们,您(也可能是您的同事)很容易同意,5米是从'1'到'5'的距离,而不是从'1'到'4'的距离......

当然,如果你想计算秒,那么你可以定义一天由某个数字秒组成,准确地说是86400。现在你可以标记每一秒,第一个是“2011/03/03 0:00:00”,第二个是“2011/03/03 0:00:01”,依此类推。那一天包括从“2011/03/03 0:00:00”到“2011/03/03 23:59:59”的所有标记秒数。 标签“2011/03/03 0:00:00”现在不再指定一个时间点,而是指定一个特定的第二,从2011/03/03 0:00:00到2011年/ 03/03 0:00:01 (我希望使用引号有助于理解差异)

在这种情况下,您当然必须接受您的离散化,即您不能表达不到一秒的持续时间。另外,如果你想在时间线上画这个,请注意你可能会把“第二个标签”放在每秒的中间(而不是开头,对应于标签谎言):也许这也有助于直观地理解差异。

答案 12 :(得分:0)

从物理角度来看,时间是连续的,有人可能会争辩说第二次(03/04 - 00:00:00)是整个24小时持续时间的一部分。然而,这是一个编程社区,因此我认为你必须将时间视为离散的东西。一天=下限到上限(包括两个界限)。如果你让一整天的上限等于另一天的下限,你就会对只知道单一边界值的情况产生歧义。

所以,简而言之,我认为现实世界中的一整天是从0:00到0:00,但在离散的计算机世界中,你希望它从0:00持续到0:00。 0:00减去您有权访问的最低时间delta,以避免价值冲突。

答案 13 :(得分:0)

让我举一个关于差异如何工作(减法)的伪图解说明。

假设你在第(3)行有一个值:

    1    2    3    4
----+----+---(+)---+

并且您想知道距其他值(1)的距离:

    1    2    3    4
---(+)---+----+----+

你减去这两个值,这将使 两个值以及 一个的端点(取决于大小和操作顺序)。

----+----+----+
subtract
----+
equals
     ----+----+

因此,计算 one day的正确方法是在day 1 at 00:00:00day 2 at 00:00:00之间取得差异。这是因为结果的长度不包括其中一个端点。

day 1 00:00:00 <= X < day 2 00:00:00

-OR -

day 1 00:00:00 < X <= day 2 00:00:00

答案 14 :(得分:0)

这个怎么样:

var oneDay = TimeSpan.FromTicks(TimeSpan.TicksPerDay);

您同时拥有:TimeSpan.FromTicksTimeSpan.TicksPerDay