求 转换美国时间为北京时间的思路,算法及代码

jordi2014 2004-09-24 02:35:24
求通用算法及代码,美国时间分东部和西部,还有夏时制等。
...全文
3215 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2004-10-09
  • 打赏
  • 举报
回复
to:lhfcsdn(存在的就是合理的)

已经有夏时制运算了。没仔细看吧?其中查找4月第一个星期日和10月最后一个星期日的代码以及处理。
jordi2014 2004-10-09
  • 打赏
  • 举报
回复
非常感谢楼上的几位。

还有没有其他好办法了?没有的话下午结贴!
northwolves 2004-09-30
  • 打赏
  • 举报
回复
世界各地夏时制执行时间有早有晚,也有拒不执行的,也有今年执行明年不执行的,混乱。

参见:http://www.timeanddate.com/time/dst2004a.html

of123()思路敏捷,支持:

Option Explicit
Private Const EasternTime As Integer = 13
Private Const CentralTime As Integer = 14
Private Const MountainTime As Integer = 15
Private Const PacificTime As Integer = 16
Private Const AlaskaTime As Integer = 17
Private Const HawaiiTime As Integer = 18

Private Function TOBEIJINGTIME(ByVal USATIMEZONE As Integer, ByVal Adate As Date) As Date 'TRANS A USER TIME in a certain USA timezone TO BEIJING TIME
Dim DSTstartday As Date, DSTendday As Date
DSTstartday = DateSerial(Year(Adate), 4, (8 - Weekday(DateSerial(Year(Adate), 4, 1), vbSunday)) Mod 7 + 1) '四月的第一个星期日开始
DSTendday = DateSerial(Year(Adate), 10, (8 - Weekday(DateSerial(Year(Adate), 10, 1), vbSunday)) Mod 7 + 1) '十月的最后一个星期日结束
If Adate > DSTstartday And Adate < DSTendday Then USATIMEZONE = USATIMEZONE - 1
TOBEIJINGTIME = Format(DateAdd("h", USATIMEZONE, Adate), "YYYY-MM-DD HH:NN:SS")
End Function
Private Sub Command1_Click()
MsgBox TOBEIJINGTIME(17, Now)
End Sub
hxy2003 2004-09-30
  • 打赏
  • 举报
回复
SystemTimeToTzSpecificLocalTime
jordi2014 2004-09-30
  • 打赏
  • 举报
回复
多谢楼上各位!

另外,刚发现有个SystemTimeToTzSpecificLocalTime的API函数,试试先!
jordi2014 2004-09-29
  • 打赏
  • 举报
回复
to of123():
还得考虑夏时制问题吧?
of123 2004-09-29
  • 打赏
  • 举报
回复
美国的 6 个时区与北京时间的时差
东部紐約(New York) -13 (4-10月-12)
中央 (Chicago) -14 (4-10月-13)
山地 (Salt Lake City) -15 (4-10月-14)
太平洋時(Los Angeles) -16 (4-10月-15)
阿拉斯加(Anchorage) -17 (4-10月-16)
夏威夷時(Honolulu) -18 (4-10月-17)


Public Const EasternTime As Interger = 13
Public Const CentralTime As Interger = 14
Public Const MountainTime As Interger = 15
Public Const PacificTime As Interger = 16
Public Const AlaskaTime As Interger = 17
Public Const HawaiiTime As Interger = 18

Public Function US_BJ_Time(Byval Americ_Time_Zone As Integer, Byval Timer_Value As Date) As Date
Dim FirstDay As Date, LastDay As Date
US_BJ_Time = DateAdd("h", Americ_Time_Zone, Timer_Value)

'Adjust For Daylight Saving Time
'The first day for Daylight Saving Time in a year is the first Sunday in April (2 AM)
For FirstDay= DateSerial(Year(Timer_Value), 4, 1) To DateSerial(Year(Timer_Value), 4, 7)
If Weekday(FirstDay) = vbSunday Then Exit For
Next
FirstDay = DateAdd("h", 2, FirstDay)

'The last day for Daylight Saving Time in a year is the last Sunday in October (2 AM)
For LastDay= DateSerial(Year(Timer_Value), 10, 25) To DateSerial(Year(Timer_Value), 10, 31)
If Weekday(LststDay) = vbSunday Then Exit For
Next
LastDay = DateAdd("h", 2, LastDay)

If Timer_Value > FirstDay And Timer_Value < LastDay Then
US_BJ_Time = US_BJ_Time - 1/24
End If

End Function
haohaohappy 2004-09-29
  • 打赏
  • 举报
回复
取得美国服务器的时间戳,可以用time()
减去中国和美国的时差,好像是八个小时吧,就是8*60*60
然后可以用date()函数格式化时间并显示了。
kmzs 2004-09-29
  • 打赏
  • 举报
回复
地理老师说:西求东加,东求西减。
northwolves 2004-09-29
  • 打赏
  • 举报
回复
考虑了:
If TIME_ZONE_ID_DAYLIGHT And tZone.DaylightDate.wMonth <> 0 Then DIFF = DIFF - tZone.DaylightBias
James0001 2004-09-29
  • 打赏
  • 举报
回复
美国本土分四个时区:
东部时区 - 大约西经87度以东,包括纽约、华盛顿、费城、亚特兰大等。
中部时区 - 大约西经87度到西经103度,包括达拉斯、休斯敦、芝加哥等。
山地时区 - 大约西经103度到西经115度,包括科罗拉多州、亚利桑那州等。
太平洋时区 - 大约西经115度以西,包括旧金山、洛杉矶、西雅图等。
注意时区的分界线都不是直线,并且有时并不和州界吻合。
另外还有:
阿拉斯加时区
夏威夷及阿留申群岛时区
jordi2014 2004-09-29
  • 打赏
  • 举报
回复
to northwolves(狼行天下):
我试了下,需转换成美国某个时区后,可以正确转换:
但不知道这个函数考虑美国夏时制的问题了吗?盼您的回复。
jordi2014 2004-09-29
  • 打赏
  • 举报
回复
to northwolves(狼行天下)
您给的这个函数是否随便给个日期和时间就可以转成北京时间?还是只能将本机设置为美国某个时区后才能正确转换呢?
northwolves 2004-09-29
  • 打赏
  • 举报
回复
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(31) As Integer
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(31) As Integer
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Private Const TIME_ZONE_ID_INVALID& = &HFFFFFFFF
Private Const TIME_ZONE_ID_STANDARD& = 1
Private Const TIME_ZONE_ID_UNKNOWN& = 0
Private Const TIME_ZONE_ID_DAYLIGHT& = 2

Private Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

Private Function TOBEIJINGTIME(ByVal ADATE As Date) As Date 'TRANS A USER TIME WITH CONTROLPANEL ZONE TO BEIJING TIME
Dim tZone As TIME_ZONE_INFORMATION
Dim DIFF As Long
GetTimeZoneInformation tZone
DIFF = -tZone.Bias
If TIME_ZONE_ID_DAYLIGHT And tZone.DaylightDate.wMonth <> 0 Then DIFF = DIFF - tZone.DaylightBias
TOBEIJINGTIME = Format(DateAdd("N", 8 * 60 - DIFF, ADATE), "YYYY-MM-DD HH:NN:SS")
End Function

Private Sub Command1_Click()'先用日期托盘设置一个美国时区时间,再执行之。
MsgBox TOBEIJINGTIME(Now)
End Sub
northwolves 2004-09-29
  • 打赏
  • 举报
回复
http://www.timeanddate.com/library/abbreviations/timezones/na/
jam021 2004-09-29
  • 打赏
  • 举报
回复
关注,帮你顶!
doxob 2004-09-28
  • 打赏
  • 举报
回复
Dim hourmei As Integer '美国时间
Dim west As Boolean '是否是西部
Dim hourzhong As Integer '中国时间
Dim xsz As Boolean '是否是夏时制

if now>"夏时制开始时间" and now<"夏时制结束时间" then
xsz=true
else
xsz=false
end if

If xsz Then
If west = True Then
hourzhong = (hourmei + 12) Mod 24
Else
hourzhong = (hourmei + 11) Mod 24
End If
Else
If west = True Then
hourzhong = (hourmei + 13) Mod 24
Else
hourzhong = (hourmei + 12) Mod 24
End If
End If
doxob 2004-09-28
  • 打赏
  • 举报
回复
我想夏时制就是从某一天的某时起提前一个小时吧,这个在那个时间上做一个判断应该就可以了。
  • 打赏
  • 举报
回复
还要判断一下州
而且没有美国时间这个说法,你是要给哪个城市做??还是哪个州做??比如最著名的加州和纽约州差四个小时,姚明在的得州跟加州差1个小时,美国有四个时区
jordi2014 2004-09-28
  • 打赏
  • 举报
回复
to doxob(doxob):
我想东部西部比较好区分,是否夏时制则还需计算一下,每年的夏时制开始日期好像不一样的。

to BlueBeer(1win):
我说的算法不是指迭代,回溯,动态规划等数据结构中提到的那些,我其实就是想知道如何将美国时间转换成北京时间的具体过程。姑且就把这个过程叫算法吧。:)

//顺便说一句,好像美国各州并不使用统一时间吧?
那么该如何转换呢?
加载更多回复(16)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧