【问题标题】:Get DateTime field from table and get year, month, and day on C#从表中获取 DateTime 字段并在 C# 上获取年月日
【发布时间】:2017-02-22 21:26:03
【问题描述】:

我有一个 SQL Server 表,其中有一个名为 ProductionDate 的 DateTime 字段。该字段的格式为:2015-06-29 00:00:00.000
我有一个 C# WinForm 应用程序选择这个日期:

string productionDate = String.Empty;
var prodDate = pallets.Select(r => r.Production_Date);
if (prodDate.Count() == 1)
{
    productionDate = prodDate.First().ToString();
}

现在,此表单使用以下行调用第二个表单:
EditBOL bol = new EditBOL(BOL, Batch, productionDate)

我要做的是,用prodDate 值填写第二个表格。
这是表单的样子:

我正在尝试使用调用函数时获得的prodDate 参数填充YearMonthDay 字段。
这是被调用的函数:

public EditBOL(string BOL, string Batch, string prodDate)
    {
        InitializeComponent();
        txtBOL.Text = BOL;
        txtBatch.Text = Batch;
        //Code to breakdown prodDAte variable comes here!!
    }

我尝试了很多不同的方法。我试过了
1.DateTime.Parse(prodDate, "yyyy-mm-dd", culture)
2.DateTime.Now.ToString("yyyy-MM-dd h:mm tt");
3.DateTime dateVariable = prodDate??DateTime.MinValue
我尝试这一切的原因是,我不想在函数中的 dateProd 变量上使用substring,因为日期可以是1-1-201510-10-2015。格式不是mm-dd-yyyy 00:00:00.000,而是m-d-yyyy 00:00:00.000
所以,子字符串似乎很愚蠢。所以我正在尝试将字符串转换为日期时间变量并执行DatetimeVariable.YearDatetimeVariable.DateDatetimeVariable.Month

编辑 1:遗漏了几行关于如何从表中选择日期的代码。

【问题讨论】:

  • "这个字段的格式是:2015-06-29 00:00:00.000" - 你说它是一个日期时间字段,在这种情况下它没有“格式” - 当你获取值,你应该只得到一个日期时间,而不是一个字符串......
  • var prodDate 获取该日期的此值:6-29-2015 00:00:00
  • 你打电话给ToString()。我建议你停止这样做。
  • 你为什么想要将它分配给一个字符串变量?为什么您希望您的 EditBOL 构造函数接受字符串而不是 DateTime 参数?您基本上是在格式化DateTime,然后再次对其进行解析......这更简单,只是一开始就不将其作为单个字符串。 (然后您可以单独格式化日/月/年。)
  • @JonSkeet 你是对的。当他们选择多个日期时,今天在另一个部门中以我的方式做这件事是一个问题。必须按照你建议的方式去做。谢谢。

标签: c# sql-server winforms sql-server-2012


【解决方案1】:

如果你坚持要解析prodDate,试试这个:

public EditBOL(string BOL, string Batch, string prodDate)
{
        InitializeComponent();
        txtBOL.Text = BOL;
        txtBatch.Text = Batch;
        //Code to breakdown prodDAte variable comes here!!
        string[] tokens = prodDate.Split(' ')[0].Split('-');
        yearTextBox.Text = tokens[0];
        monthTextBox.Text = tokens[1];
        dayTextBox.Text = tokens[2];
}

我更喜欢这种方法:

public EditBOL(string BOL, string Batch, string prodDate)
{
        InitializeComponent();
        txtBOL.Text = BOL;
        txtBatch.Text = Batch;
        //Code to breakdown prodDAte variable comes here!!
        DateTime date = Convert.ToDateTime(prodDate);
        yearTextBox.Text = date.Year.ToString();
        monthTextBox.Text = date.Month.ToString();
        dayTextBox.Text = date.Day.ToString();
}

【讨论】:

  • 上面写着Index was outside the bounds of the array。如果我理解这段代码的作用,我会修复它。你能帮忙吗?
  • 我使用您的示例作为输入 2015-06-29 00:00:00.000 并得到了正确的结果。您正在测试哪个输入 (prodDate)?
  • 再次检查问题,我编辑了用于从数据库中获取生产日期值的代码。我很抱歉。
  • 我再次测试了它,它应该适用于两种方法。
  • 更好的方法是将值作为DateTime 接受,而不是将其从DateTime 转换为 string,然后解析@987654330 @回到DateTime
【解决方案2】:

你可以使用DateTime.ParseExact():

public EditBOL(string BOL, string Batch, string prodDate)
{
    InitializeComponent();
    txtBOL.Text = BOL;
    txtBatch.Text = Batch;

    string format = "yyyy-M-d h:m:s.fff";
    DateTime dt = DateTime.ParseExact(prodDate, format, CultureInfo.InvariantCulture);

    textBoxYear.Test = dt.Year.ToString();
    textBoxMonth.Test = dt.Month.ToString();
    textBoxDay.Test = dt.Day.ToString();
}

【讨论】:

  • 忘了说了,我也试过了。但是,我没有尝试将格式存储在单独的变量中并在 ParseExact 中使用它。现在试一试。谢谢
  • @CrazyCucumber,我已经编辑了 format 变量,请参阅编辑后的答案。
猜你喜欢
  • 2015-09-07
  • 2021-08-01
  • 2019-11-29
  • 2015-09-06
  • 2011-04-11
  • 2014-10-19
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多