西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)C#.NET → 與網(wǎng)絡(luò)時間同步的時間處理函數(shù)代碼

與網(wǎng)絡(luò)時間同步的時間處理函數(shù)代碼

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:本站整理時間:2010/9/30 14:31:22字體大。A-A+

作者:佚名點擊:603次評論:0次標(biāo)簽: 時間同步

  • 類型:系統(tǒng)其它大。720KB語言:中文 評分:10.0
  • 標(biāo)簽:
立即下載
時間準(zhǔn)確的重要性不言而喻,有時候我們對時間的要求非常嚴(yán)格,有時候也要求不允許用戶調(diào)整系統(tǒng)時間,有時候。。。等等情況下,我們都需要時間的同步,雖然Windows也有DOS命令來保持和時鐘服務(wù)進行同步,但本文另辟途徑,介紹另一種獲取標(biāo)準(zhǔn)時間并同步時間的操作。

首先,我們來看看一個網(wǎng)站:國家授時中心(http://www.time.ac.cn/stime.asp),這個是應(yīng)該是時間的權(quán)威機構(gòu),里面有各國各地的時間,我們可以通過同步該時間來實現(xiàn)系統(tǒng)時間的更新。首先分兩步,一步是獲取“國家授時中心”的時間,一步是更新系統(tǒng)時間。下面的代碼就是做這些工作。

#region 獲取網(wǎng)絡(luò)時間
/// <summary>
/// 獲取中國國家授時中心網(wǎng)絡(luò)服務(wù)器時間發(fā)布的當(dāng)前時間
/// </summary>
/// <returns></returns>
public static DateTime GetChineseDateTime()
{
DateTime res = DateTime.MinValue;
try
{
string url = "http://www.time.ac.cn/stime.asp";
HttpHelper helper = new HttpHelper();
helper.Encoding = Encoding.Default;
string html = helper.GetHtml(url);
string patDt = @"\d{4}年\d{1,2}月\d{1,2}日";
string patHr = @"hrs\s+=\s+\d{1,2}";
string patMn = @"min\s+=\s+\d{1,2}";
string patSc = @"sec\s+=\s+\d{1,2}";
Regex regDt = new Regex(patDt);
Regex regHr = new Regex(patHr);
Regex regMn = new Regex(patMn);
Regex regSc = new Regex(patSc);

res = DateTime.Parse(regDt.Match(html).Value);
int hr = GetInt(regHr.Match(html).Value, false);
int mn = GetInt(regMn.Match(html).Value, false);
int sc = GetInt(regSc.Match(html).Value, false);
res = res.AddHours(hr).AddMinutes(mn).AddSeconds(sc);
}
catch { }
return res;
}

/// <summary>
/// 從指定的字符串中獲取整數(shù)
/// </summary>
/// <param name="origin">原始的字符串</param>
/// <param name="fullMatch">是否完全匹配,若為false,則返回字符串中的第一個整數(shù)數(shù)字</param>
/// <returns>整數(shù)數(shù)字</returns>
private static int GetInt(string origin, bool fullMatch)
{
if (string.IsNullOrEmpty(origin))
{
return 0;
}
origin = origin.Trim();
if (!fullMatch)
{
string pat = @"-?\d+";
Regex reg = new Regex(pat);
origin = reg.Match(origin.Trim()).Value;
}
int res = 0;
int.TryParse(origin, out res);
return res;
}
#endregion


#region P/Invoke 設(shè)置本地時間

[DllImport("kernel32.dll")]
private static extern bool SetLocalTime(ref SYSTEMTIME time);

[StructLayout(LayoutKind.Sequential)]
private struct SYSTEMTIME
{
public short year;
public short month;
public short dayOfWeek;
public short day;
public short hour;
public short minute;
public short second;
public short milliseconds;
}

/// <summary>
/// 設(shè)置本地計算機時間
/// </summary>
/// <param name="dt">DateTime對象</param>
public static void SetLocalTime(DateTime dt)
{
SYSTEMTIME st;

st.year = (short)dt.Year;
st.month = (short)dt.Month;
st.dayOfWeek = (short)dt.DayOfWeek;
st.day = (short)dt.Day;
st.hour = (short)dt.Hour;
st.minute = (short)dt.Minute;
st.second = (short)dt.Second;
st.milliseconds = (short)dt.Millisecond;

SetLocalTime(ref st);
}

#endregion


兩步操作就可以搞定時間的同步,測試效果還是不錯,不過不建議頻繁進行時間的同步處理,間隔一段時間檢查一次即可。

如果你有更好的方法,希望大家交流提高。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)