从DateTime对象中删除小时:秒:毫秒

22
我想从DateTime对象中创建一个字符串,该字符串格式为mm:dd:yyyy。
传统上,DateTime对象的格式为mm:dd:yyyy hrs:min:sec AM/PM。
有没有一种快速删除DateTime的hrs:min:sec AM/PM部分的方法,这样当我将其转换为ToString()时,它只会得到mm:dd:yyyy?

知道你得到了正确的答案 :) 只是想向你提供这个页面的提示:http://msdn.microsoft.com/en-us/library/az4se3k1(v=VS.100).aspx 这是我通常使用的日期格式化的绝佳资源 :) - Mantisen
3
传统上,DateTime对象的格式为mm:dd:yyyy hrs:min:sec AM/PM是错误的设计决定。您可能忘记了DateTime.ToString的输出取决于当前的文化设置。 - Mark Byers
10个回答

17

如果您想要从一个DateTime对象中删除小时、秒和毫秒(将其重置为 0),而不必将其转换为字符串,您可以使用Date属性。

// Get date-only portion of date, without its time.
var date = DateTime.Now.Date;

msdn


15
回答你的问题,不行 - 你必须要把它存储在不同类型中。最简单的选择是使用字符串。
string date = dateTime.ToString("MM:dd:yyyy");

然而,我强烈建议不要将日期作为字符串在程序中进行存储。这会使得对它们进行计算或比较变得困难。此外,我建议您不要强制指定日期表示的特定文化,因为这意味着您的应用程序可能在不同于您所处文化的环境下无法正常工作。

稍微更复杂一些的方法是创建一个自定义类并覆盖ToString方法。尽管如此,我仍建议避免这样做,因为使用标准库函数处理该类型仍将是困难的。您将不得不一直进行前后转换。

只需将其保留为DateTime,并仅在表示层中进行字符串转换。您可以使用DateTime.ToShortDateString来打印一个用户友好且符合文化习惯的字符串。


楼主说他正在创建一个字符串,所以我认为你应该在你的回答中说“是的”:-D - Ian G
我喜欢这个解决方案,因为在查询外部 Web 服务时需要将其作为字符串使用 :) - locoboy
不要尝试将日期时间转换为字符串来操作它!这是不好的形式,比从其组件构建当前日期时间要慢得多。 - Dave

14

虽然在大多数情况下我同意Mark Byers的观点,但我遇到了这样一种情况——我需要存储的日期时间仅精确到小时。存储分钟和秒不仅是多余的,而且也是不准确的。用户只需选择日期和小时,因此日期和小时将由用户选择,而分钟和秒将设置为当前时间。

在这种情况下,删除分钟和秒非常容易。以下是代码:

scheduledDate = scheduledDate.AddMinutes(
    scheduledDate.Minute * -1).AddSeconds(
    scheduledDate.Second * -1);

然后我将其作为完整日期时间存储在数据库中,其中分钟和秒始终为0。


这可能是展平日期时间的最佳方法。 - But I'm Not A Wrapper Class

13
datetime DateWithTimeNoSeconds = 
DateTime.Now.Date.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute);

这将获取当前日期和时间的日期,并添加小时和分钟。


13
只需执行一次DateTime.Now,将结果保存在变量中并重复使用该变量即可,否则您可能会构造出一个比实际时间早一小时甚至一天的DateWithTimeNoSeconds(如果在整点/日转换时使用)。示例:var now = DateTime.Now; now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0); - Evgeniy Berezovsky

9
DateTime date1 = new DateTime(2008, 6, 1, 7, 47, 0);
Console.WriteLine(date1.ToString());

// Get date-only portion of date, without its time.
DateTime dateOnly = date1.Date;
// Display date using short date string.
Console.WriteLine(dateOnly.ToString("d"));
// Display date using 24-hour clock.
Console.WriteLine(dateOnly.ToString("g"));
Console.WriteLine(dateOnly.ToString("MM/dd/yyyy HH:mm"));   
// The example displays the following output to the console:
//       6/1/2008 7:47:00 AM
//       6/1/2008
//       6/1/2008 12:00 AM
//       06/01/2008 00:00

http://msdn.microsoft.com/en-us/library/system.datetime.date.aspx


8
通常情况下,我使用 DateTime.ToShortDateString() 方法将日期转换为字符串,并且会以与当前线程所设置的区域性相符的方式进行格式化,只显示日期部分。

1
+1 for DateTime.ToShortDateString()。我刚写完我的答案,然后注意到你也发了完全相同的建议。 - Mark Byers
哇,一个153的表现超过了一个100379的。一定是我的幸运日:-)。谢谢! - Uwe Keim

3

您可以使用:

var newDate = new DateTime(oldDate.Year, oldDate.Month, oldDate.Day, 0, 0, 0);

2

简便方法,可能不是最好的,但

DateTime dt = new DateTime();
dt = DateTime.Now;
string sdate = dt.ToShortDateString();
dt = DateTime.Parse(sdate);

或简称
var dt = DateTime.Parse(DateTime.Now.ToShortDateString());

2
关于 DateTime.AddMinutes(或秒或小时),如果你想要减去时间而不是加上,只需要添加一个负数即可!

0

类似这样的日期和时间,不包括秒:

private DateTime _startTime;
public DateTime StartTime 
{ 
    get { return _startTime; } 
    set 
    { 
        _startTime = value.AddSeconds(-value.Second)
                          .AddMilliseconds(-value.Millisecond);   
    }
}

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