解析日期时间,但是dt会将日期从8号更改为7号?

3

DateTime dt = DateTime.Parse(value)

其中我的value值为{3/8/2011 12:00:00 AM}

但是dt的值却显示为{3/7/2011 12:00:00 AM}

请给出一些解释,因为我快要抓狂了。

编辑:OP在评论中发布的代码:

foreach (SPField field in contentType.Fields)
{
    string fValue;
    object value = spitem[field.Id];
    if (value is DateTime)
    {
        DateTime dateField = DateTime.Parse(field.GetFieldValueAsHtml(value));
        DateTime dt = DateTime.Parse(field.GetFieldValueAsText(value), CultureInfo.GetCultureInfo("en-US"));
        fValue = dt.ToShortDateString();
        lblMetaData.Text += field + ": " + fValue + "\r\n";
    }
    else
    {
        fValue = field.GetFieldValueForEdit(value);
        lblMetaData.Text += field + ": " + fValue + "\r\n";
    }
}

1
我无法重现这个问题。请在你的问题中添加导致错误的精确代码。 - Jeff Sternal
1
这根本不可能。有一些更微妙的事情正在发生,我们还不知道。 - vcsjones
发布的信息不是很准确。调试器从未显示带有大括号的字符串,它使用双引号。请发布一张截图。 - Hans Passant
5个回答

3

我无法复现你的问题。以下代码对我有效,日期部分没有变化:

DateTime dt = DateTime.Parse("3/8/2011 12:00:00 AM", CultureInfo.GetCultureInfo("en-US")); 
Assert.AreEqual(new DateTime(2011, 3, 8), dt);

请尝试发布能够重现您问题的实际代码。
更新:
既然您已经发布了一些代码,我可以说:
您的代码似乎不合理,为什么?
因为如果值是一个DateTime,那么您的代码只会执行if子句。但是在这种情况下,您首先要用GetFieldValueAsText将其转换为文本,然后再将该文本解析回DateTime。直接使用value即可。
无论如何,即使有这种奇怪的代码,如果field.GetFieldValueAsText(value)正确工作,它也应该起作用,但我怀疑它是否返回正确的字符串。

我没有var(使用.net 2.0)。而且我看不到CultureInfo。我只能看到CultureInfoConverter。 - Madhu Landh Chodh
我添加了全球化,现在看到了CultureInfo,但它没有起作用。 - Madhu Landh Chodh
2
@Madhu:你不理解以下句子中的什么内容:“发布一些代码”? - Daniel Hilgarth
@Bob。我不会重新解析,只是创建了一个新实例。稍后我会进行清理。 - Madhu Landh Chodh
@大家好 - 感谢你们的帮助和支持。Bob的解决方案对我非常有帮助。再次感谢大家。 - Madhu Landh Chodh
显示剩余4条评论

3

我的直觉告诉我代码中有一个错别字。很可能是缺少了一个赋值语句。

DateTime dt = DateTime.Parse("3/7/2011 12:00:00 AM");
....
DateTime.Parse("3/8/2011 12:00:00 AM"); //Parse's return is being ignored
....
dt is still {3/7/2011 12:00:00 AM}

请确保将对 DateTime.Parse("3/8/2011 12:00:00 AM"); 的调用赋值给dt变量。


根据您的编辑,我觉得您的代码应该这样写,不过发布的代码仍然可以工作。

foreach (SPField field in contentType.Fields) 
{ 
    string fValue;
    object value = spitem[field.Id]; 

    if (value is DateTime) 
    { 
        DateTime dt = (DateTime)value;
        fValue = dt.ToShortDateString(); 
        lblMetaData.Text += field + ": " + fValue + "\r\n";
    } 
    else 
    {         
        fValue = field.GetFieldValueForEdit(value); 
        lblMetaData.Text += field + ": " + fValue + "\r\n"; 
    }  
}

你在说什么。Datetime dt = Datetime.Parse(value)。在这种情况下,value的值为3/8/2011 12:00:00 AM。因此,dt应该是3/8/2011而不是3/7/2011。 - Madhu Landh Chodh
这一行代码起了魔法作用。DateTime dt = (DateTime)value; - Madhu Landh Chodh

2

DateTime始终包含时间信息,但您不必对其进行任何操作。例如,如果您需要向用户显示DateTime,只需不显示时间即可:

var display = DateTime.Now.ToShortDateString()

停一下。我不在意时间。看看实际日期。我输入的是3/8/2011(2011年3月8日),但结果是3/7/2011(2011年3月7日)。 - Madhu Landh Chodh

1

DateTime数据类型存储日期和时间,无法更改。

如果您想在显示日期时更改其外观,请将其格式化为仅显示日期。例如,使用dt.ToString("D");dt.ToShortDateString();


大家停一下。我不在乎时间。看看实际日期。我输入的是3/8/2011(2011年3月8日),但结果是3/7/2011(2011年3月7日)。 - Madhu Landh Chodh
1
@Madhu:也许你选择的问题主题不太好。如果是读取不同的日期,请发布你的代码。这对我来说很好用。 - Jonathan Wood

1

DateTime 结构表示时间的一个瞬间,通常以日期和时间形式表达。

如果您只想获取时间部分,可以选择 dt.ToShortTimeString();


停止一切。我不关心时间。看看实际日期。我输入了3/8/2011(2011年3月8日),但结果是3/7/2011(2011年3月7日)。 - Madhu Landh Chodh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接