Update ngày giờ của hệ thống qua Internet

Liên hệ QC
Trời ạ, đã bảo là thử chay. Tôi lười không muốn kết nối internet nên chỉ tự "bịa" ra thời gian rồi kiểm tra xem code chạy thế nào thôi. Tức code thiết lập ngày tháng, vùng chứ không phải code lấy thời gian từ internet vì code đó các bạn thử rồi còn gì?Tôi đã viết rõ:

sau khi lọc được ngày tháng và thời gian rồi thì gọi:

Mã:
SetTimeZone ...
SetLocalDateTime ...

Anh ơi! Phần ngày tháng coi như khỏi bàn tới!
Như anh nói ở trên: TZUTIL chỉ hoạt động trên Windows 7 nên em thắc mắc có cách nào để chạy được trên mọi version không?
Ngoài cách anh dùng API như trên (để Set Time Zone), liệu có cách khác, đại loại như TimeDate.cpl /"gì gì đó" hay không?
 
Anh ơi! Phần ngày tháng coi như khỏi bàn tới!
Ngày tháng là tôi viết thêm. Gọi là một lựa chọn khác. Vả lại đã API thì API tới bến luôn

Như anh nói ở trên: TZUTIL chỉ hoạt động trên Windows 7 nên em thắc mắc có cách nào để chạy được trên mọi version không?
Ngoài cách anh dùng API như trên (để Set Time Zone), liệu có cách khác, đại loại như TimeDate.cpl /"gì gì đó" hay không?

Tuấn có vẻ không khoái API "nhể".

Thôi được. Ta vẫn biết là dòng lệnh

Mã:
rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,[B][COLOR=#ff0000]1[/COLOR][/B]

sẽ mở cửa sổ Date and Time. Do cái 1 kia nên nó mở ở thẻ Time Zone.

Thế ta muốn chọn luôn "SE Asia Standard Time" rồi tự động đóng cửa sổ?

Ta thử thay 1 kia bằng "/Z SE Asia Standard Time" (Z "ám chỉ" Zone)
Tức chạy

Mã:
rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z SE Asia Standard Time

Báo cáo kết quả.
---------------
Mà nên thỉnh thoảng đổi món chút đi. Phở dĩ nhiên là ngon rồi nhưng phở mãi mà không nhớ "cơm" đang đau đáu đợi à?
 
Lần chỉnh sửa cuối:
Tức chạy

Mã:
rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z SE Asia Standard Time

Báo cáo kết quả.
---------------
Mà nên thỉnh thoảng đổi món chút đi. Phở dĩ nhiên là ngon rồi nhưng phở mãi mà không nhớ "cơm" đang đau đáu đợi à?

Thật ra trước khi hỏi thì em đã thí nghiệm "tè lè" rồi (bởi vậy em mới hỏi đích danh timedate.cpl)
Không biết trên Windows XP chạy thế nào chứ còn Windows 7 thì nó cứ trơ trơ ra tại cửa sổ Date and Time (mà chẳng set cái gì cả)
------------------------------
Tuấn có vẻ không khoái API "nhể".
Em vẫn khoái API chứ anh, nhưng nếu có món nào đó làm được từ command prompt mà lại "cực ngắn" thì em vẫn khoái hơn
Ẹc... Ẹc...
 
Thật ra trước khi hỏi thì em đã thí nghiệm "tè lè" rồi (bởi vậy em mới hỏi đích danh timedate.cpl)
Không biết trên Windows XP chạy thế nào chứ còn Windows 7 thì nó cứ trơ trơ ra tại cửa sổ Date and Time (mà chẳng set cái gì cả)

Mã:
sComm = "cmd.exe /c rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z SE Asia Standard Time"
  CreateObject("WScript.Shell").Run sComm, 0, True

Nhưng đã rundll32.exe thì thôi bỏ cmd.exe

Mã:
sComm = "rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,/Z SE Asia Standard Time"
CreateObject("WScript.Shell").Run sComm, 0, True

Tôi đã thử
1. Cả 2 code chạy trên XP
2. Cả 2 code không chạy trên trên Win 7

Mà không chạy cũng đúng thôi. Cửa sổ trong Win 7 hoàn toàn khác so với trong XP
-----------------
Mà code của tôi cũng chỉ chạy trên XP. Buồn quá. Có khi phải thiết lập quyền
 
Lần chỉnh sửa cuối:
Đúng rồi, ngày tháng hơi khó 1 chút vì phải xem Control Panel đang định dạng là d/M/y hay M/d/y
Giờ viết lại, Set cả ngày và giờ luôn nhé:

Mã:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Integer, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Integer, ByVal lpfnCB As Integer) As Integer
Private Declare Function DeleteUrlCacheEntry Lib "Wininet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Integer
Mã:
Sub DownloadFile(ByVal sURL As String, ByVal FileName As String)
  DeleteUrlCacheEntry sURL
  URLDownloadToFile 0, sURL, FileName, 0, 0
End Sub
Mã:
Function InternetDateTime() As Double
  Dim sTmp As String, sURL As String, FileName As String
  Dim fso As Object, aTmp, Arr(1 To 2)
  sURL = "http://www.timeanddate.com/worldclock/city.html?n=95"
  Set fso = CreateObject("Scripting.FileSystemObject")
  FileName = fso.GetTempName
  DownloadFile sURL, FileName
  With fso.OpenTextFile(FileName, 1)
    sTmp = .ReadAll
    .Close
  End With
  Set fso = Nothing: Kill (FileName)
  sTmp = Mid(sTmp, InStr(1, sTmp, "Current Time"))
  sTmp = Mid(sTmp, 1, InStr(1, sTmp, "</strong>") - 1)
  sTmp = Mid(sTmp, InStr(1, sTmp, "big>") + 4)
  aTmp = Split(sTmp, " at ")
  Arr(2) = TimeValue(aTmp(1))
  sTmp = Trim(Replace(aTmp(0), ",", ""))
  aTmp = Split(sTmp, " ")
  Arr(1) = DateValue(aTmp(2) & "-" & aTmp(1) & "-" & aTmp(3))
  InternetDateTime = CLng(Arr(1)) + CDbl(Arr(2))
End Function
Mã:
Sub Main()
  Dim sComm As String, sTime As String, sDate As String, sFormat As String
  Dim dNow As Double
  dNow = InternetDateTime
  sTime = Format(dNow, "hh:mm:ss")
  Select Case Application.International(xlDateOrder)
    Case Is = 0: sFormat = "MM/dd/yyyy"
    Case Is = 1: sFormat = "dd/MM/yyyy"
    Case Is = 2: sFormat = "yyyy/MM/dd"
  End Select
  sDate = Format(dNow, sFormat)
  sComm = "cmd.exe /c Time " & sTime
  CreateObject("WScript.Shell").Run sComm, 0, True
  sComm = "cmd.exe /c Date " & sDate
  CreateObject("WScript.Shell").Run sComm, 0, True
End Sub
Hiện nay khi tôi chạy code trên thì báo lỗi "Subsript out of range" ở dòng
"Arr(2) = TimeValue(aTmp(1))"
Nh
ờ các bạn chỉ khắc phục lỗi. Xin cảm ơn
 
Hiện nay khi tôi chạy code trên thì báo lỗi "Subsript out of range" ở dòng
"Arr(2) = TimeValue(aTmp(1))"
Nh
ờ các bạn chỉ khắc phục lỗi. Xin cảm ơn
Do biến sTmp nhận giá trị từ Internet như thế này:

sTmp = "thứ ba 15 Tháng tư 2014 p. 11:00:02 CH"

Vì thế nó không thể tách chuỗi có " at " được:

aTmp = Split(sTmp, " at ")

Cho nên mảng aTmp sẽ có giá trị lần lượt là:

aTmp(0) = "thứ ba 15 Tháng tư 2014 p. 11:00:02 CH"

aTmp(1) = Empty

aTmp(2) = Empty

Vì thế sẽ phát sinh ra lỗi tại:

Arr(2) = TimeValue(aTmp(1))

Với dòng chuỗi như thế, tôi cũng chẳng biết tách bắt đầu từ đâu.
 
Do biến sTmp nhận giá trị từ Internet như thế này:

sTmp = "thứ ba 15 Tháng tư 2014 p. 11:00:02 CH"

Vì thế nó không thể tách chuỗi có " at " được:

aTmp = Split(sTmp, " at ")

Cho nên mảng aTmp sẽ có giá trị lần lượt là:

aTmp(0) = "thứ ba 15 Tháng tư 2014 p. 11:00:02 CH"

aTmp(1) = Empty

aTmp(2) = Empty


Vì thế sẽ phát sinh ra lỗi tại:

Arr(2) = TimeValue(aTmp(1))

Với dòng chuỗi như thế, tôi cũng chẳng biết tách bắt đầu từ đâu.

Không phải là
Mã:
aTmp(1) = Empty
aTmp(2) = Empty

Khi không có " at " thì aTmp chỉ có 1 phần tử là aTmp(0)

Không có phần tử aTmp(1), aTmp(2) chứ không phải chúng là Empty. Nếu chúng là Empty thì có nghĩa là dòng code
Mã:
If IsEmpty(aTmp(1)) then ...

không có lỗi

Đằng này là có lỗi.

Vì LBound(aTmp) = UBound(aTmp) = 0 nên khi truy cập tới phần tử có chỉ số 1 và 2 sẽ gây lỗi "Subsript out of range"

Range ở đây là 0 - 0, vậy 1 và 2 nằm ngoài Range
-------------
Cái " at " không phải bao giờ cũng thế.

Mà bạn có "thứ ba 15 Tháng tÆ° 2014 p. 11:00:02 CH" nhưng tôi có

Current Time</th><td><strong id=ct class=big>sroda 16 kwiecien 2014 03:41:15</strong>

tức sTmp = "sroda 16 kwiecien 2014 03:41:15"

Thế này thì chịu rồi. Vì chuỗi có thể rất khác nhau tùy system và tùy thiết lập, vd. kiểu 24 hay 12 giờ.
Với chuỗi như thế thì không làm được gì.
 
Anh chị kiểm tra thủ tục sau giúp.

[GPECODE=vba]Sub GetiNetTime()

Dim ws
Dim http
Dim GMT_Time, NewNow, NewDate, NewTime, Hr, Mn, Sc
Dim sComm As String

Const GMTTime As String = "http://wwp.greenwichmeantime.com/time/scripts/clock-8/runner.php?tz=gmt"

On Error Resume Next
Set http = CreateObject("Microsoft.XMLHTTP")

http.Open "GET", GMTTime & Now(), False, "", ""
http.send

GMT_Time = http.getResponseHeader("Date")
GMT_Time = Mid$(GMT_Time, 6, Len(GMT_Time) - 9)

Hr = 7 'Hours.
Mn = 0 'Minutes.
Sc = 0 'Seconds.

NewNow = DateAdd("h", Hr, GMT_Time) 'Adding 7 Hours to GMT.
NewNow = DateAdd("n", Mn, NewNow) 'Adding 0 Minutes to GMT.
NewNow = DateAdd("s", Sc, NewNow) 'Adding 0 Seconds to GMT.

MsgBox "Current Date & Time is: SE Asia Standard time " & NewNow, vbOKOnly, "GetiNetTime"

'Thay TimeZone và ngày giờ
Set ws = CreateObject("WScript.Shell")
NewDate = DateValue(NewNow)
NewTime = Format(TimeValue(NewNow), "hh:mm:ss")

sComm = "cmd.exe /c TZUTIL /s ""SE Asia Standard time"""
ws.Run sComm, 0, True

ws.Run "%comspec% /c time " & NewTime, 0
ws.Run "%comspec% /c date " & NewDate, 0
Set ws = Nothing

Set http = Nothing

End Sub[/GPECODE]

Nguồn tại đây

Thanh Phong
 
Anh chị kiểm tra thủ tục sau giúp.

[GPECODE=vba]Sub GetiNetTime()

Dim ws
Dim http
Dim GMT_Time, NewNow, NewDate, NewTime, Hr, Mn, Sc
Dim sComm As String

Const GMTTime As String = "http://wwp.greenwichmeantime.com/time/scripts/clock-8/runner.php?tz=gmt"

On Error Resume Next
Set http = CreateObject("Microsoft.XMLHTTP")

http.Open "GET", GMTTime & Now(), False, "", ""
http.send

GMT_Time = http.getResponseHeader("Date")
GMT_Time = Mid$(GMT_Time, 6, Len(GMT_Time) - 9)

Hr = 7 'Hours.
Mn = 0 'Minutes.
Sc = 0 'Seconds.

NewNow = DateAdd("h", Hr, GMT_Time) 'Adding 7 Hours to GMT.
NewNow = DateAdd("n", Mn, NewNow) 'Adding 0 Minutes to GMT.
NewNow = DateAdd("s", Sc, NewNow) 'Adding 0 Seconds to GMT.

MsgBox "Current Date & Time is: SE Asia Standard time " & NewNow, vbOKOnly, "GetiNetTime"

'Thay TimeZone và ngày giờ
Set ws = CreateObject("WScript.Shell")
NewDate = DateValue(NewNow)
NewTime = Format(TimeValue(NewNow), "hh:mm:ss")

sComm = "cmd.exe /c TZUTIL /s ""SE Asia Standard time"""
ws.Run sComm, 0, True

ws.Run "%comspec% /c time " & NewTime, 0
ws.Run "%comspec% /c date " & NewDate, 0
Set ws = Nothing

Set http = Nothing

End Sub[/GPECODE]

Nguồn tại đây

Thanh Phong

Lẽ ra câu này:

MsgBox "Current Date & Time is: SE Asia Standard time " & NewNow, vbOKOnly, "GetiNetTime"

Phải để ở dòng cuối cùng. Lý do là nếu cứ chờ đợi lâu cho việc đọc và bấm OK thì đã mất đi "vài giây" hoặc lâu hơn nữa nếu ta không bấm OK, như thế thì cập nhật chưa sát giờ thực sự.

Nhưng code trên chạy rất chính xác.
 
Dựa vào code của TranThanhPhong, tôi làm một file có đuôi *.vbs để chạy trực tiếp khi click vào, nhưng nó bị báo lỗi như thế này:

attachment.php


Xin vui lòng cho hỏi tại sao nó bị lỗi như thế ạ? Làm ơn khắc phục lỗi dùm ạ.

Cám ơn rất nhiều.
 

File đính kèm

  • Error.jpg
    Error.jpg
    14.3 KB · Đọc: 106
  • CurrentTime.rar
    CurrentTime.rar
    724 bytes · Đọc: 28
Xoá bỏ các khoảng đi sau As...
VBScript là ngôn ngữ script. Nó luôn luôn dùng kiểu Variant. Vì vậy chỉ cần Dim abc thôi chứ không cần As
 
Lẽ ra câu này:

MsgBox "Current Date & Time is: SE Asia Standard time " & NewNow, vbOKOnly, "GetiNetTime"

Phải để ở dòng cuối cùng. Lý do là nếu cứ chờ đợi lâu cho việc đọc và bấm OK thì đã mất đi "vài giây" hoặc lâu hơn nữa nếu ta không bấm OK, như thế thì cập nhật chưa sát giờ thực sự.

Nhưng code trên chạy rất chính xác.
Làm như code này chỉ chạy đúng trên WinXP chứ không có tác dụng với Win7 hay sao đó mà chạy nó không thay đổi gì đến ngày và giờ hệ thống. Các bạn kiểm tra lại xem sao!
 
Làm như code này chỉ chạy đúng trên WinXP chứ không có tác dụng với Win7 hay sao đó mà chạy nó không thay đổi gì đến ngày và giờ hệ thống. Các bạn kiểm tra lại xem sao!

Tôi không có Win 7 để test nhưng ...
Code đọc được giờ GMT nhưng với dạng như hiện nay thì nếu trong CP chọn nước <> Anh thì
NewNow = 00:00:00
Phải lọc ngày, giờ từ GMT bằng cách khác.
 
Tôi không có Win 7 để test nhưng ...
Code đọc được giờ GMT nhưng với dạng như hiện nay thì nếu trong CP chọn nước <> Anh thì
NewNow = 00:00:00
Phải lọc ngày, giờ từ GMT bằng cách khác.
Em không biết có đúng không, nếu nước Anh bắt đầu từ 0 giờ thì chỗ này sửa lại:

Thay vì:

Hr = 7 'Hours.

Thì:

Hr = 0 'Hours.
 
Xoá bỏ các khoảng đi sau As...
VBScript là ngôn ngữ script. Nó luôn luôn dùng kiểu Variant. Vì vậy chỉ cần Dim abc thôi chứ không cần As
Không biết sao, sau khi anh hướng dẫn thì không còn lỗi nữa, click vào nó chạy nhưng không thực thi lệnh, cũng không thông báo gì cả! Có gì sai trong đó không nữa!
 
Không biết sao, sau khi anh hướng dẫn thì không còn lỗi nữa, click vào nó chạy nhưng không thực thi lệnh, cũng không thông báo gì cả! Có gì sai trong đó không nữa!

Máy anh Nghĩa chạy có nằm trong Domain Cty không? Quyền của user chạy như thế nào?

Em nghĩ là user không đủ quyền để thay đổi thông tin hệ thống.

EM đã test thủ tục đó trong Win XP, Win7 và Win8 đều chạy tốt (thiết lập CP là English như anh siwtom đã lưu ý). Cũng có thể dùng mẹo nhỏ bắt Excel xử lý ngày tháng giúp ta (ghi giá trị GMT_Time nhận được và 1 cell nào đó rồi đọc lại giá trị trong cell đó vào thủ tục) rồi hãy cho vào thủ tục chạy thì khỏi sợ thiết lập hệ thống.

Thanh Phong
 
Em không biết có đúng không, nếu nước Anh bắt đầu từ 0 giờ thì chỗ này sửa lại:

Thay vì:

Hr = 7 'Hours.

Thì:

Hr = 0 'Hours.

Vấn đề không phải ở chỗ đó.
Giờ VN = giờ GMT + 7. Ở nơi khác có thể là giờ = giờ GMT + 5. Chuyện sửa dòng
Mã:
Hr = 7

thành
Mã:
Hr = 5

là chuyện đương nhiên. Nhưng vấn đề không nằm ở chỗ đó. Nếu không sửa thì cùng lắm là cho kết quả y như giờ VN. Đằng này là ta nhận được 00:00:00.

Theo tôi nguyên nhân là cách thức hoạt động của hàm thời gian.

Chuỗi mà ta nhận được từ trang web luôn luôn là tiếng Anh ở dạng
Mã:
17 Apr 2014 08:12:52

Với những chuỗi dạng đó thì DateAdd("h", Hr, GMT_Time) trả về Empty nếu chọn trong CP <> Anh. Vì thế cuối cùng ta có NewNow = "00:00:00"

Kết luận: nếu ta có trong CP thiết lập cho nước XYZ và dạng ngày tháng dài là 17 *** 2014, trong đó *** là tên tháng bằng tiếng XYZ thì DateAdd("h", Hr, "chuỗi hic hic") trả về giá trị đúng khi và chỉ khi "chuỗi hic hic" có dạng "ab *** cdef" mà trong đó *** là bằng tiếng XYZ.

Nói cách khác thì DateAdd thao tác dựa trên thiết lập trong CP. Chuỗi truyền vào DateAdd phải có dạng ngày tháng y như được thiết lập trong CP. Nếu chuỗi truyền vào có dạng khác với dạng có trong CP thì kết quả trả về là Empty.

Thực ra cũng nên chú ý.
Ví dụ tôi chọn Pháp trong CP thì rõ ràng tôi nhìn thấy ở máy mình là "jeudi 17 avril 2014 08:12:52"

Nếu tôi cho thêm 1 dòng
Mã:
GMT_Time = "jeudi 17 avril 2014 08:12:52"

sau dòng
Mã:
GMT_Time = Mid$(GMT_Time, 6, Len(GMT_Time) - 9)

thì sau khi thực hiện
Mã:
NewNow = DateAdd("h", hr, GMT_Time)

tôi có NewNow = Empty

Nhưng nếu sửa thành
Mã:
GMT_Time = "17 avril 2014 08:12:52"

tức bỏ "jeudi" thì NewNow = "17/04/2014 15:12:52"

Vậy chuỗi truyền vào DateAdd không hẳn là y như trong CP. Nó chỉ có dạng "ngay ten_thang nam" (???). Chứ không có kiểu "gi_do ngay ten_thang nam"
 
Máy anh Nghĩa chạy có nằm trong Domain Cty không? Quyền của user chạy như thế nào?

Em nghĩ là user không đủ quyền để thay đổi thông tin hệ thống.

EM đã test thủ tục đó trong Win XP, Win7 và Win8 đều chạy tốt (thiết lập CP là English như anh siwtom đã lưu ý). Cũng có thể dùng mẹo nhỏ bắt Excel xử lý ngày tháng giúp ta (ghi giá trị GMT_Time nhận được và 1 cell nào đó rồi đọc lại giá trị trong cell đó vào thủ tục) rồi hãy cho vào thủ tục chạy thì khỏi sợ thiết lập hệ thống.

Thanh Phong

WinXP tại cơ quan thì chạy tốt, riêng laptop của anh xài Win7 Ultimate Service Pack 1 thì chạy code đó không có một tác dụng nào cả!
 
WinXP tại cơ quan thì chạy tốt, riêng laptop của anh xài Win7 Ultimate Service Pack 1 thì chạy code đó không có một tác dụng nào cả!

Bạn nói "chạy tốt" thì tôi thấy lạ.
Để hiểu nhau ta cần nói rõ là có 2 việc. Thứ nhất là chỉnh thời gian, và việc kia là thiết lập múi giờ. Bạn hãy làm thời gian sai đi và cũng chọn múi giờ khác rồi chạy code xem múi giờ có thay đổi không.

Vì khi tôi chạy code trên XP của tôi thì múi giờ không đổi. Cũng dễ hiểu thôi vì trong code có
Mã:
sComm = "cmd.exe /c [B][COLOR=#ff0000]TZUTIL[/COLOR][/B] /s ""SE Asia Standard time"""

mà XP không có tập tin TZUTIL.EXE (trong thư mục System32). Trong Windows 7 có tập tin tzutil.exe nên code trên chạy trong Windows 7.

Hay XP của tôi không có tzutil.exe vì nó là Home Edition?

Bạn viết "WinXP tại cơ quan thì chạy tốt" là do bạn chỉ để ý tới thời gian hay đúng là cả múi giờ (trước khi chạy code thì chọn múi giờ khác) cũng thay đổi?
 
Bạn nói "chạy tốt" thì tôi thấy lạ.
Để hiểu nhau ta cần nói rõ là có 2 việc. Thứ nhất là chỉnh thời gian, và việc kia là thiết lập múi giờ. Bạn hãy làm thời gian sai đi và cũng chọn múi giờ khác rồi chạy code xem múi giờ có thay đổi không.

Vì khi tôi chạy code trên XP của tôi thì múi giờ không đổi. Cũng dễ hiểu thôi vì trong code có
Mã:
sComm = "cmd.exe /c [B][COLOR=#ff0000]TZUTIL[/COLOR][/B] /s ""SE Asia Standard time"""

mà XP không có tập tin TZUTIL.EXE (trong thư mục System32). Trong Windows 7 có tập tin tzutil.exe nên code trên chạy trong Windows 7.

Hay XP của tôi không có tzutil.exe vì nó là Home Edition?

Bạn viết "WinXP tại cơ quan thì chạy tốt" là do bạn chỉ để ý tới thời gian hay đúng là cả múi giờ (trước khi chạy code thì chọn múi giờ khác) cũng thay đổi?

Thật ra em cũng không đi sâu vào múi giờ cho lắm, máy cài sẳn giờ Việt Nam, rồi em chỉnh lại lệch ngày và lệch giờ rồi chạy code, sau đó thấy nó trở lại đúng thời gian là OK rồi Thầy ơi.
 
Web KT

Bài viết mới nhất

Back
Top Bottom