ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8667|回复: 22

[分享] 儒略日转换小工具

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-11-8 16:12 | 显示全部楼层 |阅读模式
儒略日(Julian Day)是在儒略周期内以连续的日数计算时间的计时法,主要是天文学家在使用。
起点在公元前4713年(天文学上记为 -4712年)1月1日格林威治时间平午(世界时12:00)。


利用儒略日的概念,可以突破EXCEL 日期格式数据、日期函数的限制,丰富计算内容。

yuu6.JPG

儒略日201811.zip (35.37 KB, 下载次数: 212)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-8 16:14 | 显示全部楼层
Function JD2GL(JD As Double) As String
Z = Int(JD + 0.5)
F = JD + 0.5 - Z

a0 = Int((Z - 1867216.25) / 36524.25)
If Z < 2299161 Then
   A = Z
Else
   A = Z + 1 + a0 - Int(a0 / 4)
End If
B = A + 1524
c = Int((B - 122.1) / 365.25)
D = Int(365.25 * c)
E = Int((B - D) / 30.6001)

''''
d1 = B - D - Int(30.6001 * E) + F

If E < 14 Then
  m1 = E - 1
Else
  m1 = E - 13
End If

If m1 > 2 Then
  y1 = c - 4716
Else
  y1 = c - 4715
End If

d2 = Int((d1 - Int(d1)) * 86400)
hh1 = Int(d2 / 3600)
mm1 = Round(((d2 - hh1 * 3600) / 60), 0)
'ss1 = d2 - hh1 * 3600 - mm1 * 60

If mm1 < 10 Then mm1 = "0" & mm1
If mm1 = 60 Then mm1 = 59

JD2GL = y1 & "-" & m1 & "-" & Int(d1) & " " & hh1 & ":" & mm1
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-8 16:16 | 显示全部楼层
这是公历转换儒略日的 计算过程,是 儒略日转换为公历的 互补函数 。

Function GL2JD(Y As Integer, M As Integer, D As Integer) As Double

If M <= 2 Then M = M + 12: Y = Y - 1
A1 = Int(365.25 * Y)
A2 = Int(30.6001 * (M + 1))
B = -2
If Y > 1582 Or (Y = 1582 And (M > 10 Or (M = 10 And D >= 15))) Then
   B = Int(Y / 400) - Int(Y / 100)
End If
GL2JD = (A1 + A2 + B + 1720996.5) + D + 12 / 24#

End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-9 09:00 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-9 09:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1582年 公历缺10天, 及24节气 分析图 (涂绿 代表干支年范围)

6555.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-9 10:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
对sizhu函数代码 小改后,交节时刻的 月干支计算  精确到 分钟。

br1 = Split(birth, " ")
hh = br1(1)
hh2 = DateDiff("n", "12:00", hh) / 1440


If GL2JD(year, mm, dd) + hh2 >= getjq(i, 2) Then
If GL2JD(year, mm, dd) + hh2 >= getjq(temp0, i * 2) Then


65556.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-9 15:38 | 显示全部楼层
抛砖引玉,把上面的关于儒略日的几个例子,制作成附件 供测试。

儒略日综合应用举例.zip (70.19 KB, 下载次数: 134)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-9 15:44 | 显示全部楼层
本帖最后由 zopey 于 2018-11-9 17:10 编辑

八字反推代码如下,  红色部分为 修正后代码。(上楼层附件代码有 些许错误, 请自行更新)

Sub test2()
Rows("3:65535").ClearContents

    Dim LSJZ
    tt$ = "甲子 乙丑 丙寅 丁卯 戊辰 已巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 " _
        & "丙子 丁丑 戊寅 已卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 " _
        & "戊子 已丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 已亥 " _
        & "庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 已酉 庚戌 辛亥 " _
        & "壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 已未 庚申 辛酉 壬戌 癸亥"
    LSJZ = Split(tt)

Dim i As Long, lichun As String, jieqi As String

bazi = [B1]
yy1 = Left([B1], 2)
yz2 = Mid([B1], 5, 2)
rz3 = Mid([B1], 9, 2)
hh = DateDiff("n", "12:00", [a1]) / 1440

Dim k1 As Long
For i = 0 To 59
   If LSJZ(i) = yy1 Then k1 = i + 4: k3 = k3 + 1

   If LSJZ(i) = yz2 Then k2 = (i - 1) Mod 12: k3 = k3 + 1
   If k2 < 0 Then k2 = k2 + 12
  
   If k3 = 2 Then Exit For
Next

''''''''''''
k4 = 2
Dim j As Double
For i = k1 To 2200 Step 60
    jieqi1 = Int(getjq(i, k2 * 2)) - 2
    jieqi2 = Int(getjq(i, (k2 + 1) * 2)) + 2

      For j = jieqi1 To jieqi2
          If sizhu(JD2GL(j + hh)) = bazi Then
             k4 = k4 + 1
             Cells(k4, 1) = JD2GL(j + hh)
             Cells(k4, 2) = sizhu(JD2GL(j + hh))
             Exit For
          End If
      Next j
Next i
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-12 18:51 | 显示全部楼层
儒略日 应用于排列 当月日历 (按年周数+ 星期)

Function week2Day(yy As Integer, i As Integer, k As Integer, mm As Integer) As String
    Dim date1 As Long, date2 As Long, date3 As Long, j As Integer
    If i <= 0 Or i > 53 Then Exit Function
    If mm < 0 Or m > 12 Then Exit Function
   
    date1 = GL2JD(yy, 1, 1)
    j = date1 Mod 7 + 1
    j = (8 - j) + (i - 2) * 7
    date1 = date1 + (j + k - 1)
   
    If mm > 0 Then
       date2 = GL2JD(yy, mm, 1)
       date3 = GL2JD(yy, mm + 1, 1)
       If date1 >= date2 And date1 < date3 Then
          If date1 > 2299160 And date1 <= 2299177 Then
             week2Day = date1 - date2 + 11
          Else
             week2Day = date1 - date2 + 1
          End If
       End If
    Else
       week2Day = date1
    End If
End Function

推算当月日期.rar (17.32 KB, 下载次数: 114)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-11-12 19:34 | 显示全部楼层
本帖最后由 YZC51 于 2018-11-12 19:37 编辑

楼主太强大啦!谢谢分享!
白玉微瑕!
sas.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 19:47 , Processed in 0.047894 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表