我正在尝试一次一步地在C#中构造一个DateTime,就像在整个日期不在构造函数中一样。我不明白什么是错的。
DateTime d = new DateTime((long)0);
d.AddYears(2000);
但d.Years
仍将等于1。此外,我必须将日期存储为长。所以我不能只用一个巨大的构造函数构建日期,我也不能有一个持久的DateTime实例,所以我把它转储成很长的然后恢复它,然后我开始使用值0
。我想从一个不同于零的价值开始?
到底出了什么问题?
答案 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相同的经验法则。