日期时间添加年份() 数组未按预期工作

本文关键字:工作 数组 添加 时间 日期 | 更新日期: 2023-09-27 18:36:10

我对日期有问题。我无法让.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);
}

日期时间添加年份() 数组未按预期工作

  1. initial_date.AddYears(1);重复将 1 加到相同的值,因此初始值之后的所有 DateTimes 都具有相同的值。 DateTime 是不可变的,因此对其方法的调用不会更改其值,而是返回具有所需值的新实例。 您需要将其更改为initial_date.AddYears(i);
  2. 如果您希望年份范围为 2012 - 2032,您实际上需要 21 个值,而不是 20 - 因此您需要相应地调整数组长度和 for 循环条件

将问题代码更改为:

DateTime[] dates = new DateTime[21];
dates[0] = Convert.ToDateTime(initial_date);
for (int i = 1; i <= 20; i++)
{
     dates[i] = initial_date.AddYears(i);
}

它将为您提供所需的结果。

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

下面是 LINQ 中更正的代码:

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

我会稍微简化代码,正如 Mark M 在他的评论中所说,将 AddYears 中的1替换为 i

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

如果您打算设置一个具有不同年份的数组,那么您将需要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

2017/6/2 12:01:48

2018/6/2 12:01:48

2019/6/2 12:01:48

2020/6/2 下午12:01:48

2021/6/2 下午12:01:48

2022/6/2 下午 12:01:48

2023/6/2 12:01:48 PM

2024/6/2 12:01:48 PM

2025/6/2 12:01:48

2026/6/2 12:01:48 PM

2027/6/2 12:01:48 PM

2028/6/2 12:01:48 PM

2029/6/2 12:01:48

2030/6/2 12:01:48

2031/6/2 12:01:48 PM