xugu_parse_time.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package xugu
  2. type TIMESTAMP struct {
  3. year int
  4. month int
  5. day int
  6. hour int
  7. minute int
  8. second int
  9. fraction int // 毫秒
  10. }
  11. // 是否是闰年
  12. func IsLeapYear(year int) bool {
  13. return (year%4 == 0 && year%100 != 0) || (year%400 == 0)
  14. }
  15. // 月份到天数的映射
  16. var mtod = [2][13]int{
  17. {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, // 非闰年
  18. {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}, // 闰年
  19. }
  20. func dt2dtm(t int64) TIMESTAMP {
  21. var (
  22. y, m, d, s int
  23. mm, nn int
  24. wday int
  25. ms int
  26. rn_num int
  27. )
  28. if t >= 0 { // 1970年以后
  29. ms = int(t % 1000)
  30. t /= 1000
  31. s = int(t % 86400)
  32. d = int(t / 86400)
  33. wday = (d + 4) % 7
  34. mm = d / 146097
  35. nn = d % 146097
  36. y = 1970 + 400*mm
  37. mm = nn / 36524
  38. nn = nn % 36524
  39. y += 100 * mm
  40. mm = nn / 1461
  41. nn = nn % 1461
  42. y += 4 * mm
  43. if nn > 1096 {
  44. y += 3
  45. }
  46. if nn > 730 && nn <= 1096 {
  47. y += 2
  48. }
  49. if nn > 365 && nn <= 730 {
  50. y++
  51. }
  52. if nn == 0 {
  53. y--
  54. }
  55. rn_num = (y-1)/4 - (y-1)/100 + (y-1)/400
  56. rn_num -= 477
  57. d = d - 365*(y-1970) - rn_num
  58. } else { // 1970年以前
  59. ms = int(t % 1000)
  60. t /= 1000
  61. if ms != 0 {
  62. ms += 1000
  63. t--
  64. }
  65. s = int(t % 86400)
  66. d = int(t / 86400)
  67. if s != 0 {
  68. s += 86400
  69. d--
  70. }
  71. wday = (d + 4) % 7
  72. if wday < 0 {
  73. wday += 7
  74. }
  75. mm = d / 146097
  76. nn = d % 146097
  77. y = 1969 + 400*mm
  78. mm = nn / 36524
  79. nn = nn % 36524
  80. y += 100 * mm
  81. mm = nn / 1461
  82. nn = nn % 1461
  83. y += 4 * mm
  84. if nn < -1096 {
  85. y -= 3
  86. }
  87. if nn < -731 && nn >= -1096 {
  88. y -= 2
  89. }
  90. if nn < -365 && nn >= -731 {
  91. y--
  92. }
  93. if nn == 0 {
  94. y++
  95. }
  96. rn_num = y/4 - y/100 + y/400
  97. rn_num -= 477
  98. d = d - 365*(y+1-1970) - rn_num
  99. if IsLeapYear(y) {
  100. d += 366
  101. } else {
  102. d += 365
  103. }
  104. }
  105. if d < 0 {
  106. y--
  107. if IsLeapYear(y) {
  108. d += 366
  109. } else {
  110. d += 365
  111. }
  112. }
  113. d++
  114. if IsLeapYear(y) {
  115. if d > 366 {
  116. d -= 366
  117. y++
  118. }
  119. } else if d > 365 {
  120. d -= 365
  121. y++
  122. }
  123. if IsLeapYear(y) {
  124. for m = 0; m <= 11; m++ {
  125. if d > mtod[1][m] && d <= mtod[1][m+1] {
  126. d -= mtod[1][m]
  127. break
  128. }
  129. }
  130. } else {
  131. for m = 0; m <= 11; m++ {
  132. if d > mtod[0][m] && d <= mtod[0][m+1] {
  133. d -= mtod[0][m]
  134. break
  135. }
  136. }
  137. }
  138. return TIMESTAMP{
  139. year: y,
  140. month: m + 1,
  141. day: d,
  142. hour: s / 3600,
  143. minute: (s % 3600) / 60,
  144. second: s % 60,
  145. fraction: ms,
  146. }
  147. }