从班级返回日期

时间:2016-02-05 19:03:54

标签: c# string parsing datetime

我想要做的是让用户输入日期并拥有一个返回该月最后一天的课程。所以,我把它放在我的课程模块中:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="frmProfile">
  <input type="text" value="name" />
  <input type="submit" value="Go" />
</form>

在我的代码隐藏中,我有这个:

public static class StringExtensions
{
    public static DateTime LastDayOfMonth(DateTime MyDate)
    {
        DateTime today = MyDate;
        DateTime EOM = new DateTime(today.Year,today.Month,
                           DateTime.DaysInMonth(today.Year,
                           today.Month));
            return EOM;
    }
}

我也尝试过硬编码日期:

DateTime LDOM = StringExtensions.LastDayOfMonth(txtCIT.Text);

我收到了这些错误:

  

错误14最佳重载方法匹配   'ClientDPL.StringExtensions.LastDayOfMonth(System.DateTime)'有一些   无效的参数

  

错误15参数1:无法从'string'转换为'System.DateTime'

谁能看到我做错了什么?

4 个答案:

答案 0 :(得分:4)

您正在尝试将String参数传递给需要DateTime参数的方法。那么你首先需要parse你的价值:

var textCitValue = DateTime.Parse(txtCIT.Text);
DateTime LDOM = StringExtensions.LastDayOfMonth(textCitValue);

更好的方法是使用永不抛出异常的安全方法DateTime.TryParse

DateTime textCitDateTime;
if(DateTime.TryParse(txtCIT.Text, out textCitDateTime))
{
    DateTime LDOM = StringExtensions.LastDayOfMonth(textCitValue);
    // your logic here
}
else
{
    // handle invalid textbox date here
}

另外,你的命名不清楚。您的StringExtensions类的方法不是扩展方法,并使用DateTime作为参数。最好重命名您的课程并更改下一个LastDayOfMonth签名:

public static class DateTimeExtensions
{
    public static DateTime LastDayOfMonth(this DateTime date) { ... }
}

然后,您可以将此方法称为DateTime公共实例方法:

DateTime LDOM = textCitValue.LastDayOfMonth();

您还可以将方法签名更改为public static DateTime LastDayOfMonth(string date),但会为您的方法中断single responsibility principle

答案 1 :(得分:3)

您的方法期望参数为DateTime

在你的电话中:

DateTime LDOM = StringExtensions.LastDayOfMonth(txtCIT.Text);

DateTime LDOM = StringExtensions.LastDayOfMonth('1/12/2016');

在这两种情况下,您都没有传递DateTime。在调用函数之前,您需要将string转换为DateTime

这里有很多方法:Converting a String to DateTime

答案 2 :(得分:1)

正如@mason在评论中所指出的,一个更好的方法是使用类似于的DateTime扩展方法:

public static class DateTimeExtensions
{
    public static DateTime LastDayOfMonth(this DateTime date)
    {
        DateTime EOM = new DateTime(
            date.Year,date.Month,
            DateTime.DaysInMonth(
                date.Year,
                date.Month
            )
        );

        return EOM;
    }
}

可以像:

一样使用
Console.WriteLine(DateTime.Now.LastDayOfMonth());

在行动中查看:

https://dotnetfiddle.net/59Oj7c

答案 3 :(得分:1)

希望我不仅仅是通过提出这个答案来重新陈述这个问题并提前道歉,但我会更加知情地宣布两种类型的扩展,如下所示(注意{{1返回由问号表示的类型):

Nullable

然后在代码中使用它:

public static class StringExtensions
{
    public static DateTime LastDayOfMonth(this DateTime self)
    {
        return new DateTime(self.Year, self.Month, DateTime.DaysInMonth(self.Year, self.Month));
    }

    public static DateTime? LastDayOfMonth(this string self)
    {
        DateTime dt;
        if (!DateTime.TryParse(self, out dt))
            return null;

        return dt.LastDayOfMonth();
    }
}