如何获取当前日期时间,该时间不取决于系统日期时间和否必需的互联网

时间:2016-01-07 05:06:34

标签: c# asp.net wpf vb.net winforms

如何在Windows应用程序中使用c#获取当前日期时间,而不依赖于系统日期时间和NO必需的Internet

3 个答案:

答案 0 :(得分:0)

答案是你不能。如果您没有从系统或互联网上选择时间,则无法获得当前的日期时间。

答案 1 :(得分:0)

实际上,我不知道为什么你不能使用系统时间。如果您认为它可能不精确且用户需要设置它,那当然可以通过代码完成。以下代码段显示了如何从C#设置系统代码:

[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
    [MarshalAs(UnmanagedType.U2)]
    public short Year;
    [MarshalAs(UnmanagedType.U2)]
    public short Month;
    [MarshalAs(UnmanagedType.U2)]
    public short DayOfWeek;
    [MarshalAs(UnmanagedType.U2)]
    public short Day;
    [MarshalAs(UnmanagedType.U2)]
    public short Hour;
    [MarshalAs(UnmanagedType.U2)]
    public short Minute;
    [MarshalAs(UnmanagedType.U2)]
    public short Second;
    [MarshalAs(UnmanagedType.U2)]
    public short Milliseconds;
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetSystemTime(
[In] ref SystemTime lpSystemTime);

/// <summary>
/// Set the system time to the given date/time. 
/// The time must be given in utc.
/// </summary>
/// <param name="dt">Date/time to set the system clock to</param>
/// <returns>True on success, false on failure. This fails if the current user has insufficient rights to set the system clock. </returns>
/// <remarks>This method needs administrative priviledges to succeed.</remarks>
public static bool SetSystemTimeUtc(DateTime dt)
{
    bool bSuccess = false;
    if (dt.Year >= 2100) // limit the year to prevent older C-routines to crash on the local time
    {
        dt = new DateTime(2099, dt.Month, dt.Day);
    }

    SystemTime st = DateTimeToSystemTime(dt);
    try
    {
        bSuccess = SetSystemTime(ref st);
    }
    catch (System.UnauthorizedAccessException)
    {
        bSuccess = false;
    }
    catch (System.Security.SecurityException)
    {
        bSuccess = false;
    }

    return bSuccess;
}

private static SystemTime DateTimeToSystemTime(DateTime dt)
{
    SystemTime st;

    st.Year = (short)dt.Year;
    st.Day = (short)dt.Day;
    st.Month = (short)dt.Month;
    st.Hour = (short)dt.Hour;
    st.Minute = (short)dt.Minute;
    st.Second = (short)dt.Second;
    st.Milliseconds = (short)dt.Millisecond;
    st.DayOfWeek = (short)dt.DayOfWeek;

    return st;
}

如上面的评论所示,此方法需要用户为管理员,否则将失败。

答案 2 :(得分:0)

你已经知道了答案。无法完成。

所以你需要改变策略。

如何判断某人是否在欺骗时钟?

您需要创建一个可用作参考的文件。对初学者尝试这一点,如果需要,可以使这种方法更难以检测,并且更难以让用户克服。

安装程序时,创建一个文件,根据系统时间将内容设置为自某个随机日期以来的秒数。现在,一旦你运行你的程序,检查以确保时钟从那时起没有倒退。如果有,请问!!!!,如果还没有,请再次更新文件。

这里的关键是向您认为会欺骗您的用户隐藏此文件。您可能会隐藏注册表中的信息,或作为其他文件的一部分。希望当用户识别出你上次运行时存储时,他无法弄清楚你是如何存储上次运行的时间,并且无法设置向后标记。

这个系统似乎很容易被击败,但只有当最终用户知道你这样做时,才知道你存储信息的每个地方(将它存储在三个不同的文件中,包括c:\ temp),并且确切知道如何您正在加密它的最后运行日期。我不知道你的观众,但我的赌注是你试图阻止一个青少年永远使用试用版,一旦系统相当复杂(需要超过5分钟才能击败),你是很安全。

您可以做的另一件事是当您发现最终用户可能在作弊时,开始删除您的程序部分,使其不再运行。