0

我有一个日期时间,我想显示与DateTime.Now收到的日期时间的区别并绑定它。结果应该是这样的:

1d 15h 13m 7s

最好的方法是什么?StringFormat? IValueConverter?

4

5 回答 5

4

我建议使用 TimespansToString方法和自定义 TimeSpan 格式字符串

如果您还不知道时间跨度是为测量这样的时间间隔而设计的,可以通过从另一个日期中减去一个日期来方便地获得。

var startDate = new DateTime(2013,1,21);
var currentDate = DateTime.Now;
TimeSpan interval = currentDate - startDate;
string intervalInWords = String.Format("{0:%d} days {0:%h} hours {0:%m} minutes {0:%s} seconds", interval);
Console.WriteLine(intervalInWords);

这将打印出类似

267 天 10 小时 45 分 21 秒

正如评论中所指出的,因为这些日期时间可能在不同的时区/夏令时,您应该非常小心地使用这种技术。如果可行,对两者使用全年一致的 UTCtime 就足够了。通常,最好的策略是将所有日期时间与时区/偏移量(如果需要)一起保存为 UTC,然后如果需要它们在显示的特定时区偏移量中转换。

于 2013-10-15T09:46:32.470 回答
1

使用时间跨度

例子:

DateTime oldDate = new DateTime(2002,7,15);
DateTime newDate = DateTime.Now;

// Difference in days, hours, and minutes.
TimeSpan ts = newDate - oldDate;
// Difference in days.
int differenceInDays = ts.Days;

现在您可以根据您的要求进行更改。

于 2013-10-15T09:38:00.430 回答
0

创建一个DateProp类型的属性,您将在 XAML 上绑定到该属性,并假设您的属性是 Other_date_here,像这样初始化它:

DateProp = DateTime.Now.Subtract(Other_date_here);

最后,在您的 XAML 上,绑定它并设置如下格式:

Text="{绑定日期, StringFormat=d 天 H 小时 m 分钟 s 秒}"

(或您喜欢的任何其他格式:)。

于 2013-10-15T10:12:00.970 回答
0

您可以使用 TimeSpan,也可以查看 [这里][1]

[1]:以小时为单位显示两个日期时间值之间的差异我建议您通过 TimeSpan。

DateTime startDate = Convert.ToDateTime(2008,8,2);
    DateTime endDate = Convert.ToDateTime(2008,8,3);
    TimeSpan duration = startDate - endDate;
于 2013-10-15T10:08:17.910 回答
0

从格式的角度来看,其他答案是正确的,但只是为了解决 WPF 角度,我猜您想更新标签/文本框,以便它不断包含准确的持续时间?

如果是这样,您可以使用计时器和调度程序执行此操作。

定时器代码:

//duration in milliseconds, 1000 is 1 second
var timer = new Timer(1000);
timer.Elapsed += timer_Elapsed;
timer.Start();

计时器经过代码:

//this is set elsewhere
private readonly DateTime _received;

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Application.Current.Dispatcher.Invoke(
        DispatcherPriority.Normal,
        new Action(() 
            => //replace label1 with the name of the control you wish to update
            label1.Content = 
            string.Format("{0:%d} days {0:%h} hours {0:%m} minutes {0:%s} seconds"
            , (DateTime.Now - _received))));
}
于 2013-10-15T10:16:21.880 回答