2012-02-07 87 views
1

我做错了吗?C#日期操作

   DateTime previousDay = new DateTime(year, month, day); 
       string test1 = previousDay.ToString(); 
       previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 
       string test2 = previousDay.ToString(); 
       previousDay.AddDays(-1); 
       string test3 = previousDay.ToString(); 

由于某种原因,对大多数人来说可能很明显,日期不会从test1更改为test3。
请帮忙!

回答

13

DateTime是不可改变的 - 当你调用Subtract它不会改变调用的目标,它回报一个新值:

DateTime previousDay = new DateTime(year, month, day); 
string test1 = previousDay.ToString(); 
previousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 
string test2 = previousDay.ToString(); 
previousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 
string test3 = previousDay.ToString(); 

虽然我使用-运营商,并TimeSpan.FromDays

DateTime previousDay = new DateTime(year, month, day); 
string test1 = previousDay.ToString(); 
previousDay = previousDay - TimeSpan.FromDays(1); 
string test2 = previousDay.ToString(); 
previousDay = previousDay - TimeSpan.FromDays(1); 
string test3 = previousDay.ToString(); 

或者更好的是,使用AddDays

DateTime previousDay = new DateTime(year, month, day); 
string test1 = previousDay.ToString(); 
previousDay = previousDay.AddDays(-1); 
string test2 = previousDay.ToString(); 
previousDay = previousDay.AddDays(-1); 
string test3 = previousDay.ToString(); 

甚至更​​好,但使用Noda Time :)

LocalDate date = new LocalDate(year, month, day); 
string test1 = previousDay.ToString(); 
date = date.PlusDays(-1); 
string test2 = previousDay.ToString(); 
date = date.PlusDays(-1); 
string test3 = previousDay.ToString(); 

或者:

LocalDate date = new LocalDate(year, month, day); 
string test1 = previousDay.ToString(); 
date = date + Period.FromDays(-1); 
string test2 = previousDay.ToString(); 
date = date + Period.FromDays(-1); 
string test3 = previousDay.ToString(); 
+0

嗯,我说,这是可能明显对大多数人来说!感谢这样一个完整的答案! – CompanyDroneFromSector7G 2012-02-07 11:30:47

+0

@bukko请将上面的帖子设置为“答案” – fizzbuzz 2012-02-07 11:36:42

+0

@hotadvice我试过 - 有一段时间延迟。有耐心! – CompanyDroneFromSector7G 2012-02-07 11:48:06

1

DateTime是不变的,这意味着每次调用SubtractAddDays实际上与返回值的新实例。 previousDay永远不会改变。

2

:)这将返回一个新的datetime,但并没有改变主叫对象值

previousDay.AddDays(-1); 
+0

我们再次遭到怀疑。团结! Stack的弱者,让我们冷静下来! – 2012-02-07 11:56:48

1

尝试:(如日期时间像串类是不可变的)

DateTime previousDay = new DateTime(year, month, day);     
string test1 = previousDay.ToString();     
previousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0));     

1

修改这一行:

previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 

previousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 

OR

,如果你不想改变一个变量

DateTime updatedPreviousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 
2

问题是你实际上并没有改变previousDay的价值。

您需要实际分配新值:

previousDay = previousDay.AddDays(-1); 
1

你只是减去日期时间变量的新的时间跨度,但不分配结果的日期时间变量。所以,这些更改不会影响日期时间变量。所以,最好这样做。

previousDay = previousDay.Subtract(new TimeSpan(1, 0, 0, 0)); 
string test2 = previousDay.ToString(); 

or 

string test2 = (previousDay.Subtract(new TimeSpan(1, 0, 0, 0))).ToString();