感谢您抽出宝贵时间阅读本文:
我正在处理一个涉及我们学校钟声倒计时的申请。我添加了一个计时功能,可以将可疑差异(1分44秒)添加到系统时间,以获得上学时间。
由于一些奇怪的原因,起初,计时器接近铃声(正负50毫秒)(在学校时间下午2:55,实时时间2:53:17),但是一旦我删除了50毫秒,第二天早上时间差了近5秒钟(铃声比程序晚5秒钟响了),所以我加了5秒钟,下午继续关闭5秒,所以我把它放回去了到104秒(1分44秒),我们还没有测试过。
我有些人似乎认为我的程序有问题,因为代码与我设置的原始差异没有任何变化。我已经在VB.Net中清理了解决方案,并再次构建它(使用清洁解决方案和菜单栏中的构建选项)。
就我个人而言,我相信因为我们的学校计时器是相当旧的系统(20多年),或许它每天的速度超过X秒,或者学校的钟声还有其他不一致的地方,而不是我的自己的计划。我可能会提醒你,学校时间提前1分44秒。所以当学校时间下午2:55:00时,实时是下午2:53:17。
如果某人比我更有经验,或者可能有更好的解决方案的人可以查看我正在粘贴的代码(在底部),并提供有关该问题的一些反馈,那将非常感激。
整个计时器在一个Functions_CalibrateTime()Public Shared Sub中运行,每10毫秒运行一次(不要问为什么,这有逻辑原因)。倒数计时器仅在上午7:00到上午11:59之间运行AM,并且铃声在AM上午8:45(学校时间)响铃,PM倒计时在下午12:00到下午2:55之间运行。我道歉..这是一段相当长的代码:
'Announcement API: Calibrate Time
Public Shared Sub Functions_CalibrateTime()
AVC.SYS_ANN_CurrentSchoolTime = AVC.SYS_GEN_SystemTime.AddSeconds(104)
If Date.Now.Hour > 12 Then
AVC.SYS_ANN_CurrentAnnouncePeriod = "PM"
ElseIf Date.Now.Hour < 12 Then
AVC.SYS_ANN_CurrentAnnouncePeriod = "AM"
End If
' Gets (Real) Date and Time
AVC.SYS_GEN_SystemTime = TimeOfDay
AVC_Output.Label2.Text = AVC.SYS_ANN_TodaysDate.ToString("dddd") & ", " & AVC.SYS_ANN_TodaysDate.ToLongDateString
AVC.SYS_GEN_Timers_CountDownFlashMode = False
' Countdown Clock
Dim MorningAMTimeStart As Date = TimeValue("08:45:00")
Dim MorningPMTimeFinish As Date = TimeValue("14:55:00")
'AM: Only Starts clock at 7 O'Clock AM, and Ends at 12
If AVC.SYS_ANN_CurrentSchoolTime.Hour >= 7 And AVC.SYS_ANN_CurrentSchoolTime.Hour < 12 Then
If AVC.SYS_ANN_CurrentSchoolTime.Hour <= 8 And AVC.SYS_ANN_CurrentSchoolTime.Minute < 45 Then
AVC_Dashboard.Timer3.Enabled = True
AVC.SYS_GEN_Timers_CountDownValue = DateDiff(DateInterval.Second, AVC.SYS_ANN_CurrentSchoolTime, MorningAMTimeStart)
AVC.SYS_GEN_Timers_CountDownValue += 1
Dim iSpan As TimeSpan = TimeSpan.FromSeconds(AVC.SYS_GEN_Timers_CountDownValue)
AVC.SYS_GEN_Timers_CountDownText = iSpan.Hours.ToString.PadLeft(2, "0"c) & ":" & iSpan.Minutes.ToString.PadLeft(2, "0"c) & ":" & iSpan.Seconds.ToString.PadLeft(2, "0"c)
Else
AVC.SYS_GEN_Timers_CountDownFlashMode = False
AVC.SYS_GEN_Timers_CountDownText = " Offline"
End If
Else
If AVC.SYS_ANN_CurrentAnnouncePeriod = "AM" Then
AVC.SYS_GEN_Timers_CountDownFlashMode = False
AVC.SYS_GEN_Timers_CountDownText = " Offline"
End If
End If
'PM: Only Starts at 12:55 PM, and Ends Counter at 2:55 PM
If AVC.SYS_ANN_CurrentSchoolTime.Hour >= 12 And AVC.SYS_ANN_CurrentSchoolTime.Hour <= 14 Then
If AVC.SYS_ANN_CurrentSchoolTime.Hour <= 14 And AVC.SYS_ANN_CurrentSchoolTime.Minute < 55 Then
AVC_Dashboard.Timer3.Enabled = True
AVC.SYS_GEN_Timers_CountDownValue = DateDiff(DateInterval.Second, AVC.SYS_ANN_CurrentSchoolTime, MorningPMTimeFinish)
Dim iSpan As TimeSpan = TimeSpan.FromSeconds(AVC.SYS_GEN_Timers_CountDownValue)
AVC.SYS_GEN_Timers_CountDownText = iSpan.Hours.ToString.PadLeft(2, "0"c) & ":" & iSpan.Minutes.ToString.PadLeft(2, "0"c) & ":" & iSpan.Seconds.ToString.PadLeft(2, "0"c)
Else
AVC.SYS_GEN_Timers_CountDownFlashMode = False
AVC.SYS_GEN_Timers_CountDownText = " Offline"
End If
Else
If AVC.SYS_ANN_CurrentAnnouncePeriod = "PM" Then
AVC.SYS_GEN_Timers_CountDownFlashMode = False
AVC.SYS_GEN_Timers_CountDownText = " Offline"
End If
End If
'PM: Timer Flashing System
If AVC.SYS_GEN_Timers_CountDownValue < 60 Then
AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.Orange
AVC_Output.pnl_CountDown_Flash.BackColor = Color.Orange
AVC.SYS_GEN_Timers_CountDownFlashMode = False
If AVC.SYS_GEN_Timers_CountDownValue <= 30 Then
AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.Red
AVC_Output.pnl_CountDown_Flash.BackColor = Color.Red
If AVC.SYS_GEN_Timers_CountDownValue <= 10 Then
AVC.SYS_GEN_Timers_CountDownFlashMode = True
If AVC.SYS_GEN_Timers_CountDownValue = 0 Then
AVC_Output.pnl_CountDown_Flash.Visible = True
AVC.SYS_GEN_Timers_CountDownFlashMode = False
AVC_Dashboard.Timer3.Enabled = False
AVC_Output.pnl_CountDown_Flash.BackColor = Color.FromArgb(43, 43, 43)
AVC_Output.lbl_Output_CountDownTime.ForeColor = Color.White
End If
End If
End If
End If
再一次,抱歉所有的文字和一切,我想尽可能彻底地解释。如果您需要进一步解释,我将非常乐意更详细地解释或简化。
最后,感谢你们所做的一切,祝你们度过愉快的一天!