注册 登录
编程论坛 VB6论坛

请教VB获取二十四节气数据

益西翁登 发布于 2015-01-03 10:49, 1567 次点击
请教VB如何获取二十四节气数据
15 回复
#2
wp2319572015-01-04 08:31
这主要取决于节气如何计算

我摆渡到以下数据,不过不知道如何计算的

程序代码:

#include<stdio.h>

int main()
{
    /*
      通式寿星公式——[Y×D+C]-L
      D=0.2422
      本世纪C=4.475
      Y 年份
      L=闰年数 年/4-15
    */
    double D=0.2422;
    double C=4.475;
    int lichun;
    int Y=2015;
    lichun=(int)(Y*D+C)-(int)(Y/4-15);
    printf("%d年的立春日期是%d月%d日。\n",Y,2,lichun);
    return 0;
}

/*
   运行结果如下:
   2015年的立春日期是2月4日。
*/

#3
wp2319572015-01-04 08:33
网页bug 导致重复发帖

[ 本帖最后由 wp231957 于 2015-1-4 08:45 编辑 ]
#4
chen35232015-01-04 09:27
我花了很长时间写程序,核对万年历有的日期还是不对,不知错对是谁。具体到时分还不懂怎样写程序。你也玩择吉编程?我是由于爱好择吉而选择了自学编程帮助记忆。
#5
xzlxzlxzl2015-01-04 14:49
按照回归年为365.2422天计算,代码如下:

  Dim i As Double, d As Date
  Const bs = "2014-2-4 6:3:15"
  i = 2017 - 2014
  i = i * 365.2422 * 24 * 3600
  d = DateAdd("s", i, bs)
  MsgBox "2017年立春时间为:" & d

运行后会提示“2017年立春时间为:2017-02-03 23:29:33 ”
经查2017年立春时间实际为 02月03日 23:34:01 ,差268秒,不知为什么。有的年份居然隔600多秒,10多分钟,不知道是按什么算的。
#6
xzlxzlxzl2015-01-04 15:03
现在想来,估计是由于地球并不是在一个圆形轨道上运转造成的,当立春正处于近日点时,地球公转速度快,可能会出现负数,立春在远日点,地球公转慢,则会出现大于的误差(如2013年就是-56秒),看来要准确计算,要有天体轨道运算公式才行,甚至要考虑到月球的影响。

[ 本帖最后由 xzlxzlxzl 于 2015-1-4 15:07 编辑 ]
#7
lianyicq2015-01-04 15:45
回复 5楼 xzlxzlxzl
天体运动周期测算要精确到秒级估计不太可能吧。再者说每回归一次所用的时间也不一样。回归年按天算近似到四位小数,也是多个年份的综合考虑,也许就是平均值。用平均值计算得到的结果和真实值总会有出入。普通应用上足够了,精准时间只能由天文学家来推测了。
#8
xzlxzlxzl2015-01-04 22:45
回复 7楼 lianyicq
地球公转的周期是非常稳定的,一恒星年为365.25天,一回归年为365.24219天,如果有其他天体的摄动,估计影响是在纳秒量级。
24节气是按阳历来排的,每年相同节气间隔应该是一个365.24219天的等差数列,现实查表发现最大有正负10分钟的误差,不是等差,就应该是地球公转的非圆形轨道造成的。
#9
yangfrancis2015-01-05 14:14
如果农历年的每个月永远不变是三十天还好说,但有“闰”的问题,很难精确解决。二十四节气如何推算出来就更不知如何下手了。作为阴历月的划分依据,要择日什么的节气必不可少。真是麻烦
#10
益西翁登2015-01-08 10:49
怎样取得二十四个节气呢?
#11
wp2319572015-01-08 10:50
取得立春日期后 往后推呗
#12
xzlxzlxzl2015-01-08 21:58
原想从立春开始往后每个节气按365.2422/24=15.218425的间隔推算,结果发现有的日期不准确,如是以1997年的各节气时间为标准来推算,发现日期基本准确,但仍然不能精确到秒,能精确到小时就很不错了,实在不行用查表完成吧。


Function getSolar(inYear As Integer) As String
  '根据给出的年份返回该年份所有节气准确时间,精确到秒,从立春开始用逗号间隔开
  Const y_s = 31556925.9747        '一年的总秒数
  Const bs = "1997-01-05 15:24:28"   '1997年小寒的准确时间
  Const jq = "小寒,大寒,立春,雨水,惊蛰,春分,清明,谷雨,立夏,小满,芒种,夏至,小暑,大暑,立秋,处暑,白露,秋分,寒露,霜降,立冬,小雪,大雪,冬至"
  Const jqjg = "0,21198.05,42457.483,63807.02,85299.65,106950.2,128791.8,150818.35,173034.967,195413.42,217928.05,240535.467,263184.92,285830.97,308411.833,330894.72,353224.35,375390.983,397360.7,419150.283,440750.167,462203.083,483520.4,504401.42"
  Dim i As Integer, j As Integer, c As Double, d1 As Date, m() As String, n() As String, b(23) As Date, a As String
  m = Split(jq, ","): n = Split(jqjg, ",")
  c = (inYear - 1997) * y_s   '获取给出的年份和基础年份间隔的总秒数
  d1 = DateAdd("s", c, bs)    '获取该年份的小寒具体日期,精确到秒
  If UBound(m) <> 23 And UBound(n) <> 23 Then Exit Function
  For i = 0 To 23
    c = Val(n(i)) * 60
    b(i) = DateAdd("s", c, d1)
  Next
  a = ""
  For i = 0 To 23
    j = i + 2
    If j > 23 Then j = j - 24
    a = a & inYear & "年" & m(j) & ":" & b(j) & ","
  Next
  a = Left(a, Len(a) - 1)
  getSolar = a
End Function

Private Sub Form_Click()
  Dim y As Integer, a As String, b() As String, i As Integer
  y = InputBox("请输入查询年份:")
  If y < 1900 Then y = 1997
  a = getSolar(y)
  b = Split(a, ",")
  Me.Cls
  For i = 0 To 23
    Print b(i)
  Next
End Sub

Private Sub Form_Load()
  Me.Show
  Me.AutoRedraw = True
  Form_Click
End Sub

只有本站会员才能查看附件,请 登录
#13
益西翁登2015-01-10 11:12
受益了,谢谢!
#14
renxiaoyao362015-01-11 12:08
回复 2楼 wp231957
你查到的代码应该是Pascal或者C语言(话说我要不是学过点Pascal也看不懂这玩意)
#15
wmf20142015-01-11 13:12
回复 14楼 renxiaoyao36
呵,你这大葱插的,也不像啊!
pasical里{}是用来注释的,语句体是以begin开始end结束。用花括号表示语句体的是类c格式的语言。如c、java、flash等。
幸亏我常在c里混,对c稍微熟悉那么一点。
#16
yangfrancis2015-01-12 23:36
二十四节气是根据北斗的摇光星所指向的地支方位来划定的,人都想不出该怎么求证,何况程序。
1