如何在不使用DateTime的情况下将年,月和日转换为刻度

时间:2012-01-31 09:08:40

标签: c# datetime

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

但如何在没有DateTime 构造函数的情况下执行此操作?

修改
我真正想要的是只保留年龄,月份和天数。

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

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

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您可以找出计算中的天数,然后乘以864,000,000,000(即一天中的滴答数)。那是你在找什么?这里有一些文档:http://msdn.microsoft.com/en-us/library/system.timespan.ticksperday.aspx

快乐的编码,
干杯,
克里斯。

好的 - 没想到这一点!刻度表示自0001年1月1日午夜12点00分起100纳秒间隔的数量。您需要计算自该日期起经过的天数,然后乘以每天的刻度值!

如果我理解你的话,你不担心一天中特定时间的嘀嗒声吗?!所以,这将是:

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

这会回答你的问题吗?

答案 2 :(得分:0)

除非你有其他方式来获取当前的日期和时间,否则这将是相当困难的。根据{{​​3}}:

  

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

     

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

现在,如果你知道当前的日期和时间,你可以计算自January 1, 0001以来经过的天数,并用它来计算滴答数。

答案 3 :(得分:0)

您的帖子中已有答案:

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构造函数的原因,因此这是解决您问题的最佳解决方案。

答案 4 :(得分:0)

我知道你不想要日期的小时部分。如果您使用日期,那么您只能获得当天(例如:01/01/2012 00:00:00)

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

当然,任何已创建的DateTime对象都是相同的。

long ticks = dateObject.Date.Ticks;

答案 5 :(得分:0)

我有一个用例,其中我无法使用DateTime,但是需要Ticks中的Years / Months。

我使用了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