获取独立于 SystemTime 的实际 DateTime
Get actual DateTime independent of SystemTime
Objective: 我正在开发一个可以在线和离线工作的应用程序。该应用程序具有在应用程序中创建和保存注释的功能。此外,该应用程序首次打开时需要互联网连接。之后,它可以在离线模式下工作,一旦应用程序连接到互联网,它就会发送所有的笔记
问题: 我需要将准确的 "Date Created" 字段连同注释一起发送到服务器。 "Date Created"时间必须准确,即使系统时间错误。
当应用程序第一次连接到互联网时,我从服务器获得了正确的时间。是否可以使用我们第一次从服务器获取的时间来跟踪独立于系统时间的时间,即使应用程序关闭或系统重新启动。
我尝试使用 PerformanceCounter("System", "System Up Time"
来保证系统的正常运行时间。即使应用程序关闭,我也能够跟踪时间。但无法跟踪用户是否重新启动系统。
此外,即使用户在离线模式下故意更改系统时间,我也需要跟踪正确的时间。在 C# 中是否有任何回调函数?
注意:我正在使用 SQLlite 作为后端,我可以用它做些什么吗?
您可以考虑的两个选项:
- 使用
Stopwatch
,它专为测量经过的时间而设计。当您检索服务器时间时启动它,然后您可以在需要时将经过的时间添加到服务器时间。但是,我不知道如果有人挂机,你挂到一个Stopwatch
会怎么样。
- 当您检索服务器时间时,请注意系统时钟的值(使用
DateTime.UtcNow
- 不要在此处涉及本地时间),并将两者进行比较以获得两个时钟之间的差值。您可以在任何时候应用增量来预测服务器时钟会说什么。使用这种方法的注意事项:
- 如果本地时钟 运行 过慢或过快(或被 Windows 时间服务等调整),增量可能会变得不正确。
- 如果用户调整了系统本地时钟,你就会遇到问题。
基本上没有互联网连接,您唯一的时间来源就是本地系统。问题的严重程度取决于您担心的故障模式 - 如果这只是 方便 的问题,以便笔记有正确的时间,而您不需要担心恶意用户更改时钟,这可能不是什么大问题。如果您绝对需要一个准确、独立的时间戳,那么您基本上就卡住了。
(当然,您可以通过 重复 花费服务器时间并将其与您期望的任何内容进行比较来稍微改进这些方案 - 这可以帮助检测篡改或偶然漂移。但在某些时候你会下线,从那时到下一次你上线时你无能为力。)
尝试使用 UTC 日期而不是普通的获取日期函数
在 c# 中
DateTime.UTCNow
在Sql服务器
getutcdate()
Objective: 我正在开发一个可以在线和离线工作的应用程序。该应用程序具有在应用程序中创建和保存注释的功能。此外,该应用程序首次打开时需要互联网连接。之后,它可以在离线模式下工作,一旦应用程序连接到互联网,它就会发送所有的笔记
问题: 我需要将准确的 "Date Created" 字段连同注释一起发送到服务器。 "Date Created"时间必须准确,即使系统时间错误。
当应用程序第一次连接到互联网时,我从服务器获得了正确的时间。是否可以使用我们第一次从服务器获取的时间来跟踪独立于系统时间的时间,即使应用程序关闭或系统重新启动。
我尝试使用 PerformanceCounter("System", "System Up Time"
来保证系统的正常运行时间。即使应用程序关闭,我也能够跟踪时间。但无法跟踪用户是否重新启动系统。
此外,即使用户在离线模式下故意更改系统时间,我也需要跟踪正确的时间。在 C# 中是否有任何回调函数?
注意:我正在使用 SQLlite 作为后端,我可以用它做些什么吗?
您可以考虑的两个选项:
- 使用
Stopwatch
,它专为测量经过的时间而设计。当您检索服务器时间时启动它,然后您可以在需要时将经过的时间添加到服务器时间。但是,我不知道如果有人挂机,你挂到一个Stopwatch
会怎么样。 - 当您检索服务器时间时,请注意系统时钟的值(使用
DateTime.UtcNow
- 不要在此处涉及本地时间),并将两者进行比较以获得两个时钟之间的差值。您可以在任何时候应用增量来预测服务器时钟会说什么。使用这种方法的注意事项:- 如果本地时钟 运行 过慢或过快(或被 Windows 时间服务等调整),增量可能会变得不正确。
- 如果用户调整了系统本地时钟,你就会遇到问题。
基本上没有互联网连接,您唯一的时间来源就是本地系统。问题的严重程度取决于您担心的故障模式 - 如果这只是 方便 的问题,以便笔记有正确的时间,而您不需要担心恶意用户更改时钟,这可能不是什么大问题。如果您绝对需要一个准确、独立的时间戳,那么您基本上就卡住了。
(当然,您可以通过 重复 花费服务器时间并将其与您期望的任何内容进行比较来稍微改进这些方案 - 这可以帮助检测篡改或偶然漂移。但在某些时候你会下线,从那时到下一次你上线时你无能为力。)
尝试使用 UTC 日期而不是普通的获取日期函数
在 c# 中
DateTime.UTCNow
在Sql服务器
getutcdate()