【问题标题】:How to add year, month, day from two datetime in C# Asp.Net?如何从 C# Asp.Net 中的两个日期时间添加年、月、日?
【发布时间】:2016-01-03 08:39:02
【问题描述】:

我从两个文本框中得到了两个日期时间,并计算了年、月、日,并将 > 之类的值连接起来并保存到 Experience(列名) 中。 假设,在这个列中也有一些值,比如

                      >> 1 Year 3 month 2 days
                      >> 2 Year 10 month 10 days

现在我想添加这些列值并在标签中显示值> 我怎样才能在 C# Asp.Net 中做到这一点?任何人都可以帮助做到这一点...

【问题讨论】:

  • 您的问题很难理解,您是否想从每个文本框计算出与今天日期的差异,最后添加差异并显示在标签上?
  • 请提供您用于将 DateTime 转换为 1 Year 3 month 2 days 的代码。此外,还不清楚在发布/获取请求 (C#) 期间是否需要在客户端 (JavaScript) 或服务器端进行此计算。请提供有关您要实现的目标的更多信息。
  • 添加 2 个日期的年份绝对没有意义... 2016 + 2015 = 什么? - 这解释了为什么你找不到解决它的方法。使用正确的类型(例如 TimeSpan)会使这个问题完全没有必要。
  • 请看我的解释好吗?我说我从 2 个文本框中得到了两个日期,并从这些日期计算年、月、日,并将我得到的 1 年 2 月 3 天的值连接起来并保存到数据库列中。比如更多的值保存到列中。现在我想从数据库中读取这些值并将这些值相加并显示在标签上。 @Alexei
  • 其实不能。一年可以是 365 或 366 天,一个月是 28-31 天,因此您的结果将是“4 年 1 个月 一些 天”。因此,最初,将 timespan 存储在两个文本框之间即可完成 - 因为这些可以立即相加。

标签: c# sql asp.net datetime


【解决方案1】:

好的,所以根据您的评论,我理解基于“经验”列您想要存储某人做某事的时间长度。 在处理每月 31 天、闰年等事情的同时,实际执行此操作的最佳方法是存储实际日期(开始、结束)。 比,你计算日期之间的差异:

System.TimeSpan diff1 = date2.Subtract(date1);
System.TimeSpan diff2 = date4.Subtract(date3);

然后添加 2 个时间跨度:

System.TimeSpan added = diff1.Add(diff2);

为了从中获取正确的数据,您必须添加一个日期,以便计算机可以计算特殊的年份、月份中的天数等。 因此,例如将添加到今天的日期:

System.DateTime today = System.DateTime.Now;
System.DateTime answer = today.Add(added);

这是实现您想要的更好的方法。 如果您只需要粗略估计,请执行 3 列:年、月和日,并将它们与除法相加: 如果添加天 \ 30 > 0 => 添加 1 个月等。

编辑

由于您想解析字符串,而不是更改结构,如果您是: 确保格式是恒定的,因此每次:“x 年 y 月 z 天”,包括空格,请执行以下操作:

string[] parts = str.Split(' '); // split by spaces
// now the numbers are in fields 0,2,4
int years = 0;
int.TryParse(parts[0],out years);
int months = 0;
int.TryParse(parts[2],out months);
int days = 0;
int.TryParse(parts[4],out days);

这是 1 个跨度。做第二次并添加零件(几天到几天等)。

然后添加类似的东西:

if (addedDays > 30) 
{
  addedMonths++;
  addedDays = addedDays - 30;
}

等等

【讨论】:

  • 假设,“1 年 3 月 2 天”是字符串。现在告诉我如何从这个字符串中得到 1、3 和 2 ? @塔基尔
  • 这会很乱。为什么不改变数据库的结构?当你可以做得更好时,解析字符串不是一个好主意......
  • 不,我不能。这就是我需要的结构。你能给我任何解决方案吗? @tarkil
  • 完美的一点是,不能添加两个以 y/m/d 表示的“间隔”,而不仅仅是几天 - 即使是 15d+15d 也没有办法用单一结果来回答(比如1 个月 2 天)。旁注:OP已经得到了复制粘贴准备好的答案中的代码(甚至没有接受那个解决方案......) - 所以我不希望OP得到更多关注。
【解决方案2】:

这段代码应该适合你。

        List<string> experiences = new List<string>() {"1 Year 3 month 2 days", "2 Year 10 month 10 days"}; //don't know how you populate it. Use your method here to populate experiences array.

        int years = 0;
        int months = 0;
        int days = 0;
        foreach (var experience in experiences)
        {
            years += experience.Contains(" Year ")
                ? int.Parse(experience.Split(new[] {" Year "}, StringSplitOptions.None)[0].Replace(" ",""))
                : 0;
            months += experience.Contains(" Year ") && experience.Contains(" month ")
              ? int.Parse(experience.Split(new[] { " Year " }, StringSplitOptions.None)[1].Substring(0,2))
              : 0;
             days += experience.Contains(" month ") && experience.Contains("days")
            ? int.Parse(experience.Split(new[] { " month " }, StringSplitOptions.None)[1].Substring(0, 2))
            : 0;
        }

        if (days > 30)
        {
            int monthsInDays = days/30;
            months += monthsInDays;
            days = days%30;
        }
        if (months > 12)
        {
            int yearsInMonths = months/12;
            years += yearsInMonths;
            months = months%12;
        }

        Console.WriteLine("Total experience is {0} Years {1} Months {2} Days", years, months, days);

【讨论】:

  • 谢谢哥们,非常感谢 :) 它有效...@Kosala W
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多