一次构建一个DateTime

时间:2009-08-20 19:23:25

标签: c# datetime serialization

我正在尝试一次一步地在C#中构造一个DateTime,就像在整个日期不在构造函数中一样。我不明白什么是错的。

DateTime d = new DateTime((long)0);
d.AddYears(2000);

d.Years仍将等于1。此外,我必须将日期存储为长。所以我不能只用一个巨大的构造函数构建日期,我也不能有一个持久的DateTime实例,所以我把它转储成很长的然后恢复它,然后我开始使用值0。我想从一个不同于零的价值开始?

到底出了什么问题?

4 个答案:

答案 0 :(得分:16)

DateTime结构是不可变的,这意味着它的属性不能改变。

AddYears方法返回一个必须使用的新DateTime:

DateTime d = new DateTime((long)0);
d = d.AddYears(2000);

答案 1 :(得分:2)

可能偏离主题,但如果您需要将DateTime保留为long,那么为什么不保留其Ticks属性返回的值。

然后,您可以使用the constructor that takes a ticks parameter恢复DateTime个实例:

// stage 1
DateTime dt = DateTime.MinValue.AddYears(2009);
PersistTicksToSomewhere(dt.Ticks);

// stage 2
long ticks = GetPersistedTicksFromSomewhere();
DateTime dt = new DateTime(ticks).AddMonths(8);
PersistTicksToSomewhere(dt.Ticks);

// stage 3
long ticks = GetPersistedTicksFromSomewhere();
DateTime dt = new DateTime(ticks).AddDays(20);
PersistTicksToSomewhere(dt.Ticks);

// etc etc

答案 2 :(得分:1)

DateTime构造函数有12种不同的重载。应该至少有一个你可以适应你的使用。

此:

DateTime d = new DateTime(2000,0,0);

优于:

DateTime d = new DateTime((long)0);
d = d.AddYears(2000);

只需预先构建尽可能多的日期,并为其他参数输入零。

答案 3 :(得分:0)

DateTime是不可变的,因此您必须如此更改它 DateTime d = new DateTime(); d d.AddYears(2000);

然而,这将在99.9%的时间实例化一个新的DateTime,但是如果它嵌套在一个永远运行的循环中,那么最好使用许多DateTime构造函数之一。使用与string和StringBuilder相同的经验法则。