【问题标题】:C# - Convert.ToDateTime() where Year is not specified in the DateC# - Convert.ToDateTime() 其中年份未在日期中指定
【发布时间】:2021-04-13 15:11:39
【问题描述】:

我想转换如下表示的日期列表:

  • 6 月 6 日
  • 9 月 18 日
  • 11 月 2 日
  • 2 月 29 日

日期本身不指定年份,因此当我尝试使用Convert.ToDateTime() 解析它们时,假定当前年份(2021)。如何将这些日期指定为不同的年份?假设我想指定这些日期中的每一个都来自2020 年。如何在转换中指定它?这是我会使用CultureInfo 的地方吗?

【问题讨论】:

  • new DateTime(Year, Month, Day);
  • 以这种方式解析事物要非常小心;在我的系统上DateTime.Parse("June 6") 没有错误地继续给出 2006-06-01 的完全错误的结果。 DateTime.Parse("June 6", new CultureInfo("en-US")) 做了正确的事,但即使那样我也不确定自己是否会更舒服地使用固定的月份名称列表进行解析。
  • DateTime.ParseExact(date + " 2020", "MMMM d yyyy", System.Globalization.CultureInfo.InvariantCulture)?

标签: c# datetime datetime-conversion


【解决方案1】:

您可以解析 (ParseExact) 提供的text;唯一可能的问题是闰年2月29日

private static DateTime MyConvert(string text, int year = 0) {
  return DateTime.ParseExact(
    $"{(year <= 0 ? DateTime.Today.Year : year)} {text}", 
    "yyyy MMMM d", 
    CultureInfo.InvariantCulture);
}

演示:

  string[] tests = new string[] {
    "June 6",
    "September 18",
    "November 2",
    "February 29"
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,-15} => {MyConvert(test, 2000):dd.MM.yyyy}"));

  Console.Write(report);

结果:

June 6          => 06.06.2000
September 18    => 18.09.2000
November 2      => 02.11.2000
February 29     => 29.02.2000

【讨论】:

    【解决方案2】:

    一行就能搞定:

    string textDate = "September 18";
    int desiredYear = 2008;
    
    DateTime date = Convert.ToDateTime(desiredYear.ToString() + textDate);
    

    【讨论】:

      【解决方案3】:

      只是事后更改年份。

      var input = "June 6";
      var converted = DateTime.ParseExact("mmmm d");
      var date = new DateTime(DateTime.Today.Year, converted.Month, converted.Day);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-28
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多