2012-06-02 66 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