将DateTime.Now转换为秒

18

我正在尝试编写一个函数,将DateTime.Now实例转换为它所表示的秒数,以便可以将其与另一个DateTime实例进行比较。这是我目前的代码:

public static int convertDateTimeToSeconds(DateTime dateTimeToConvert)
    {
        int secsInAMin = 60;
        int secsInAnHour = 60 * secsInAMin;
        int secsInADay = 24 * secsInAnHour;
        double secsInAYear = (int)365.25 * secsInADay;

        int totalSeconds = (int)(dateTimeToConvert.Year * secsInAYear) + 
                       (dateTimeToConvert.DayOfYear * secsInADay) +
                       (dateTimeToConvert.Hour * secsInAnHour) +
                       (dateTimeToConvert.Minute * secsInAMin) + 
                       dateTimeToConvert.Second;

        return totalSeconds;
    }

我知道我在计算一年中的秒数时做了截断,但我不需要我的计算精确到小数点后几位。我只是想知道我用来计算秒数的方法是否正确。

有没有人有更好的方法可以从DateTime对象中计算秒数?

此外,如果我要计算公元0年以来的所有秒数,那么在使用C#编码时返回类型应该是int64吗?


2
抱歉如果我有点多管闲事,但是你为什么要比较秒数而不是使用内置的日期计算工具呢? - Marko
我正在尝试从上述两个对象中的一个中减去一个以秒为单位给定的整数变量。 - TheDevOpsGuru
如果您不打算以秒为单位进行测量,则可以使用.Ticks来获取自参考时间以来的TICKS数。 (Time1-Time2)给出一个TimeSpan的结果,其中总时间以秒为单位,并且如果需要其他单位也可以提供。 - jerrylagrou
9个回答

38

DateTime 类型支持 比较操作符

if (dateTimeA > dateTimeB)
{
    ...

对于由DateTime.AddSeconds返回的DateTime值,这也适用:

if (dateTimeA.AddSeconds(42) > dateTimeB)
{
    ...
如果你需要从01/01/0001 00:00:00开始计算到现在经过的秒数,可以通过两个日期值之间的差来计算得出。得到的时间差TimeSpan对象具有TotalSeconds属性。
double result = DateTime.Now.Subtract(DateTime.MinValue).TotalSeconds;

14

将DateTime对象转换为秒并没有太多意义。只有在处理时间长度(TimeSpan)时,秒才有意义。如果您想比较两个日期来获取它们之间的秒数:

TimeSpan diff = DateTime.Now - PreviousDateTime;
double seconds = diff.TotalSeconds;

9

如果目的是查找两个日期之间的秒数,最好使用 TimeSpan 对象。

TimeSpan span = date2 - date1;
double seconds = span.TotalSeconds;

注意:你需要使用 TimeSpan.TotalSeconds,而不是 TimeSpan.Seconds。 - dtb
请使用TotalSeconds而不是Seconds。Seconds表示在考虑到天数、小时数、分钟数等后剩余的秒数。 - rein
谢谢,问题已解决。我混淆了思维,认为“总数”函数返回整个单位的数量,而不包括这些单位的任何分数。 - GendoIkari

8

我做了 DateTime.Now.Ticks / 10000000,我猜这很相似。 - Jacksonkr

6
假设您确实需要获取datetime对象的秒数,您可以直接从中获取“Ticks”属性。 这些不是以秒为单位的,但您可以轻松地通过适当的因子除以Ticks来将其转换为秒。 参见:http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx 所以,类似以下内容:
        DateTime.Now.Ticks/TimeSpan.TicksPerSecond

4

这个会起作用吗:if(a.AddSeconds > b)?我问这个问题是因为我有一个缓冲时间,我需要从其中一个对象中减去。缓冲时间以秒为单位。 - TheDevOpsGuru
2
是的,你可以这样做:如果 DateTime.Now.AddSeconds(10) > otherDateTime - rein

3

我会使用TimeSpan类来获取两个DateTime实例之间的确切差异。这里是一个例子:

  DateTime dt1 = DateTime.Now;
  DateTime dt2 = new DateTime(2003,4,15);
  TimeSpan ts = dt1.Subtract(dt2);

一旦TimeSpan值(在上面的代码片段中为ts)可用,您可以检查其值以正确将TimeSpan转换为给定数量的秒。


2
确保使用ts.TotalSeconds,将TimeSpan转换为秒,而不是仅使用ts.Seconds,后者只是秒的组成部分。 - Doug Ferguson

2

使用TimeSpan来获取两个DateTime之间经过的时间可能是最好的方法,但如果您真的想获取给定DateTime的秒数,可以像下面这样做:

DateTime dateTimeToConvert = DateTime.Now;
TimeSpan tsElapsed = dateTimeToConvert - DateTime.MinValue;
return tsElapsed.TotalSeconds;

请注意,tsElapsed.TotalSeconds 是一个 Double 类型,而不是 Int 类型。

1
请注意,目标是获取自DateTime.MinVal(日历的第一天)以来的秒数。我之所以这样说,是因为我看到了所有这些“您可以像这样进行时间比较...添加对象,乘以该对象并对它们进行交叉计算,除以总和结果的商,然后Boom!不是您要求的内容”的答案。
这里有一个非常简单的答案。Ticks是100纳秒增量。DateTime object.Ticks是自1/1/0001以来发生的tick数。即,零年。一秒钟有1000万纳秒。所以...
    public static long convertDateTimeToSeconds(DateTime dateTimeToConvert) {
        // According to Wikipedia, there are 10,000,000 ticks in a second, and Now.Ticks is the span since 1/1/0001. 
        long NumSeconds= dateTimeToConvert.Ticks / 10000000;
        return NumSeconds;
    }

1
我整理了一下我的帖子...所以...请开始踩我吧! :D - CherryCoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接