2012-06-02 41 views
0

我有一个日期问题。我不能让.AddYears()方法工作。有人可以请看看我在这里做错了什么。DateTime AddYears()数组不按预期工作

MySqlConnection myMySqlConnection = new MySqlConnection(connectionString); 
MySqlDataAdapter da = new MySqlDataAdapter(); 
MySqlCommand cmd1; 
cmd1 = new MySqlCommand("SELECT INITIAL_DATE FROM USERS WHERE ID = @id1", myMySqlConnection); 
cmd1.Parameters.AddWithValue("@id1", id); 
myMySqlConnection.Open(); 
da.SelectCommand = cmd1; 
DateTime initial_date = (DateTime)cmd1.ExecuteScalar(); 
myMySqlConnection.Close(); 

从这点及以下问题:

DateTime[] dates = new DateTime[20]; 
dates[0] = Convert.ToDateTime(initial_date); 

for (int i = 1; i < 20; i++) 
{ 
    dates[i] = initial_date.AddYears(1); 
} 
+2

运行此代码时发生了什么? – doogle

+3

难道你不想'日期[i] = initial_date.AddYears(i);'所以你没有日期时间1-> 20作为同一日期?这是你遇到的问题吗?顺便说一句,DateTime是不可变的,所以你运行它的任何方法来创建一个新的DateTime将返回一个新的DateTime实例,而不会改变你执行该方法的那个。 –

+0

从数据库中选择的第一个值是2012年1月20日,我想要一个包含值1/20/2012,1/20/2013,1/20/2014 ....等等的数组持续20年。最后一个值(日期[19])必须是1/20/2032 –

回答

1
  1. initial_date.AddYears(1);重复将1加到相同的值,因此所有日期时间在初始值之后都是相同的值。 DateTime是不可变的,因此对其方法的调用不会更改其值,但会返回具有所需值的新实例。你需要如果你想岁月的范围是2012年将其更改为initial_date.AddYears(i);
  2. - 2032,你确实需要21个值,而不是20 - 所以您需要调整您的数组长度和循环条件相应

更改您的问题代码:

DateTime[] dates = new DateTime[21]; 
dates[0] = Convert.ToDateTime(initial_date); 

for (int i = 1; i <= 20; i++) 
{ 
    dates[i] = initial_date.AddYears(i); 
} 

它会给你你需要的结果。

+0

1+你的评论价值不止回答 – Damith

0

我会稍微简化代码,并作为标记M在他的评论中说,通过i

DateTime[] dates = new DateTime[20]; 
for (int i = 0; i < 20; i++) { 
    dates[i] = initial_date.AddYears(i); 
} 
替换 AddYears1
+0

OMG你是完全正确的,我很抱歉的大惊小怪......我的错误 –

1

正如Mark M指出的那样,您的问题可能在于您添加了1而不是i,通过gh for循环中的AddYears方法。

下面是LINQ更正后的代码:

DateTime[] dates = Enumerable.Range(0, 20).Select(initial_date.AddYears).ToArray(); 
+0

非常感谢你的linq代码,但我现在不使用linq –

0

如果你的目的是要建立具有不同年数组,然后你会想AddYears(i),而不是只增加1年

DateTime initial_date = DateTime.Now; 
DateTime[] dates = new DateTime[20]; 
dates[0] = Convert.ToDateTime(initial_date); 

for (int i = 1; i < 20; i++) 
{ 
    dates[i] = initial_date.AddYears(i); 
    Console.WriteLine(dates[i]); 
} 

这将打印出:

2013年6月2日下午12时01分48秒

2014年6月2日下午12点01分48秒

2015年6月2日下午12点01分48秒

2016年6月2日下午12点01分48秒

6/2/2017年下午12时01分48秒

2018年6月2日下午12时01分48秒

2019年6月2日下午12时01分48秒

2020年6月2日12:01: 48 PM

2021年6月2日下午12点01分48秒

2022年6月2日下午12点01分48秒

2023年6月2日下午12点01分48秒

6/2/2024下午12时01分48秒

2025年6月2日下午12时01分48秒

2026年6月2日下午12时01分48秒

2027年6月2日12:01: 48 PM

2028年6月2日下午12点01分48秒

2029年6月2日下午12点01分48秒

2030年6月2日下午12点01分48秒

6/2/2031 12:01:48 PM