这是为了解决办公室对一整天所构成的意见的不同。
代表一整天(到第二天)我会说:
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 =一整天。
如果有人可以打扰回复这个!!他们认为哪个是正确的?
编辑:
几个月过去了,办公室里有“其他意见”的两个人不再在这里工作了......
答案 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 - 1
和2.0 - 0.9
。你能指望什么?
这是一年级的简单的基础初等数学。
答案 10 :(得分:0)
答案 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:00
和day 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);