如何在不使用日期时间的情况下将年、月和日转换为刻度

本文关键字:转换 情况下 时间 日期 | 更新日期: 2023-09-27 18:21:54

long ticks = new DateTime(2012, 1, 31).ToLocalTime().Ticks; // 634635684000000000

但是如何在没有日期时间构造函数的情况下做到这一点?

编辑
我真正想要的是只保留滴答声中的年、月和日。

long ALL_Ticks = DateTime.Now.Ticks; // 634636033446495283
long Only_YearMonthDay = 634635684000000000; // how to do this ?

我想使用 Linq.Translations 在 linq-sql 查询中使用它。

如何在不使用日期时间的情况下将年、月和日转换为刻度

如果您只需要当前日期时间的日期部分的刻度线,您可以使用:

    long Only_YearMonthDay = DateTime.Now.Date.Ticks; //634635648000000000
    //DateTime.Now.Date.Ticks + DateTime.Now.TimeOfDay.Ticks == DateTime.Now.Ticks

您可以找出计算中的天数,然后乘以 864,000,000,000(即一天中有多少个即时报价(。 这就是你要找的吗? 这里有一些文档:http://msdn.microsoft.com/en-us/library/system.timespan.ticksperday.aspx。

快乐编码,
干杯
克里斯。

好吧 - 没有正确考虑这个问题! 刻度表示自 0001 年 1 月 1 日午夜 12:00:00 以来的 100 纳秒间隔量。 您需要计算自该日期以来已经过去了多少天,然后将其乘以每日刻度值!

如果我理解正确的话,你不担心一天中特定时间的滴答声?! 因此,它将大致如下:

var ticksToDate = (DateTime.UtcNow - DateTime.MinValue).Days * 864000000000;

这回答了你的问题吗?

除非您有其他方法来获取当前日期和时间,否则这将是相当困难的。根据MSDN:

单个刻度表示一百纳秒或千万分之一秒。一毫秒内有 10,000 个刻度。

此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数,表示 DateTime.MinValue。它不包括可归因于闰秒的刻度数。

现在,如果您知道当前的日期和时间,则可以计算自January 1, 0001以来已经过去了多少天,并使用它来计算即时报价的数量。

我知道你不想要日期的小时部分。如果使用日期,则仅获取日期(例如:01/01/2012 00:00:00(

long ticks = new DateTime(2012, 1, 31).Date.Ticks;

当然,已经创建的任何日期时间对象都是相同的。

long ticks = dateObject.Date.Ticks;

你的帖子中已经有了答案:

long ALL_Ticks = DateTime.Now.Ticks; 
// that's the ticks (from DateTime.MinValue) until 'now' (this very moment)
long ticks = new DateTime(2012, 1, 31).ToLocalTime().Ticks;
// or
long ticks = DateTime.Now.Date.Ticks;
// that's the ticks until the beginning of today
long yearmonthticks = new DateTime(2012, 1, 1).ToLocalTime().Ticks;
// that's the ticks until the beginning of the month
// etc..., the rest is simple subtractions

由于您的问题没有指定不使用 DateTime 构造函数的任何原因,因此这是解决看似您的问题的最佳解决方案。

我有一个用例,我无法使用日期时间,但需要从滴答中获取年/月。

我使用DateTime背后的来源来弄清楚如何。若要采用另一种方式,您可以查看构造函数,其中一个构造函数调用以下代码。

    private static long DateToTicks(int year, int month, int day) {
        if (year >= 1 && year <= 9999 && month >= 1 && month <= 12) {
            int[] days = IsLeapYear(year)? DaysToMonth366: DaysToMonth365;
            if (day >= 1 && day <= days[month] - days[month - 1]) {
                int y = year - 1;
                int n = y * 365 + y / 4 - y / 100 + y / 400 + days[month - 1] + day - 1;
                return n * TicksPerDay;
            }
        }
        throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay"));
    }

这可以在下面的链接中找到,当然,您需要重写以满足您的需求,并查找常量和IsLeapYear函数。

https://referencesource.microsoft.com/#mscorlib/system/datetime.cs,602

相关文章: