2009-09-28 157 views
31

我有两个蒙面的文本框控件,并想知道如何去获取每个时间,然后将差异转换为毫秒。就像在tb1中写的,我写“12:01”,在tb2中写“12:02”,然后点击一个按钮。一旦按钮被点击,它启动一个计时器,并在12:02显示一个消息框。除了时间转换部分外,我知道如何去做所有的事情。将2倍转换为毫秒之差?

如何实现?

+1

您的问题不清楚。你不知道如何获得两个DateTime之间的差异或如何将“12:01”转换为DateTime? – 2009-09-28 14:01:12

回答

82
DateTime dt1 = DateTime.Parse(maskedTextBox1.Text); 
DateTime dt2 = DateTime.Parse(maskedTextBox2.Text); 
TimeSpan span = dt2 - dt1; 
int ms = (int)span.TotalMilliseconds; 
10

要回答这个冠军的问题:

DateTime d1 = ...; 
DateTime d2 = ...; 
TimeSpan diff = d2 - d1; 

int millisceonds = (int) diff.TotalMilliseconds; 

您可以使用此设置一个计时器:

timer1.interval = millisceonds; 
timer1.Enabled = true; 

处理蜱时,切勿忘记关闭计时器。

但是如果你想要一个事件 12:03,刚刚替补DateTime.Now为d1

但不清楚textBox1和textBox2的确切功能是什么。

+1

您需要使用TotalMilliseconds,而不是毫秒。 – MusiGenesis 2009-09-28 14:11:22

+1

您需要“TotalMilliseconds”而不是“毫秒” 毫秒将仅给出时间差的毫秒“余数”,而不是整个时间跨度。 2.475秒给出毫秒= 475,总毫秒= 2475 – StarPacker 2009-09-28 14:14:07

+0

是的,已更正。 Darn TimeSpan界面。 – 2009-09-28 14:15:10

5

你必须文本框的值转换为日期时间(T1,T2),则:

DateTime t1,t2; 
t1 = DateTime.Parse(textbox1.Text); 
t2 = DateTime.Parse(textbox2.Text); 
int diff = ((TimeSpan)(t2 - t1)).TotalMilliseconds; 

或者使用DateTime.TryParse(TextBox1中,从T1); 错误处理由您决定。

+0

从大脑记忆:))) – 2009-09-28 14:04:34

+1

你第一次是对的:你需要使用TotalMilliseconds(除非你喜欢每次都返回0)。 – MusiGenesis 2009-09-28 14:12:32

0

尝试:

DateTime first; 
DateTime second; 

int milliSeconds = (int)((TimeSpan)(second - first)).TotalMilliseconds; 
+0

不需要对TimeSpan进行类型转换,TotalMilliseconds是双精度型。 – 2009-09-28 14:09:03

+0

演员不会伤害表演并使意图更清晰。将返回值转换为int也是有道理的,因为它必须按照OP的要求进行转换,以便与定时器一起使用。顺便说一句,代码只是一个例子,所以如果有任何错误并且值得投票,请详细说明。 – 2009-09-28 14:56:39

+0

没有返回值的转换。最后一行不会编译。 – 2009-09-28 15:41:28

0

尝试以下操作:

DateTime dtStart; 
    DateTime dtEnd; 

    if (DateTime.TryParse(tb1.Text, out dtStart) && DateTime.TryParse(tb2.Text, out dtEnd)) 
    { 
     TimeSpan ts = dtStart - dtEnd; 
     double difference = ts.TotalMilliseconds; 
    } 
0

如果你只是想在12:02显示一个消息框,使用计时器控制用的,比方说,250ms的延迟,它会继续检查当前时间是否是12:02。如果是,显示消息并停止计时器。请注意,这不需要开始时间字段(尽管您可能正在将其用于其他内容 - 我不知道 - 在这种情况下,在此处提供给您的其他代码将会有所帮助)。

1

如果您只处理Times和没有日期,您只想处理TimeSpan并处理午夜交叉。

TimeSpan time1 = ...; // assume TimeOfDay 
TimeSpan time2 = ...; // assume TimeOfDay 
TimeSpan diffTime = time2 - time1; 
if (time2 < time1) // crosses over midnight 
    diffTime += TimeSpan.FromTicks(TimeSpan.TicksPerDay); 
int totalMilliSeconds = (int)diffTime.TotalMilliseconds; 
0
var firstTime = DateTime.Now; 
var secondTime = DateTime.Now.AddMilliseconds(600); 
var diff = secondTime.Subtract(firstTime).Milliseconds; 


// var diff = DateTime.Now.AddMilliseconds(600).Subtract(DateTime.Now).Milliseconds; 
+0

请小心这个答案。使用'微秒'而不是'TotalMilliseconds'给出不同的结果,前者仅给出时间跨度的毫秒分量,后者给出以毫秒为单位的总时间。 – 2017-08-12 04:06:18

4

许多上述方案可能适合不同的人。
我想推荐一个稍微修改过的代码,比“MusiGenesis”的大多数接受的解决方案。

DateTime firstTime = DateTime.Parse(TextBox1.Text); 
DateTime secondTime = DateTime.Parse(TextBox2.Text); 
double milDiff = secondTime.Subtract(firstTime).TotalMilliseconds; 

考虑
- earlierTime.Subtract(laterTime)你会得到一个负值。
- 使用int milDiff = (int)DateTime.Now.Subtract(StartTime).TotalMilliseconds;如果你需要整数值,而不是双
- 相同的代码可以用来获得两个日期值之间的差异,你可能会得到.TotalDays.TotalHours insteaf的.TotalMilliseconds

0
public static Int64 GetDifferencesBetweenTwoDate(DateTime newDate, DateTime oldDate, string type) 
    { 
     var span = newDate - oldDate; 
     switch (type) 
     { 
      case "tt": return (int)span.Ticks; 
      case "ms": return (int)span.TotalMilliseconds; 
      case "ss": return (int)span.TotalSeconds; 
      case "mm": return (int)span.TotalMinutes; 
      case "hh": return (int)span.TotalHours; 
      case "dd": return (int)span.TotalDays; 
     } 
     return 0; 
    } 
0

VB.net,桌面应用。如果您需要以毫秒为单位的流逝时间:

Dim starts As Integer = My.Computer.Clock.TickCount 
Dim ends As Integer = My.Computer.Clock.TickCount 
Dim lapsed As Integer = ends - starts