Как преобразовать юлианскую дату, игнорируя год, в юлианский день

Как преобразовать день/месяц в день по юлианскому календарю в Visual Basic? Также приветствуются формулы для конвертации на другие языки.

Например, юлианский день для 1 февраля = 032

https://landweb.modaps.eosdis.nasa.gov/browse/calendar.html

Из исследований в Интернете большинство резолюций преобразуют дату с гггг-мм-дд в дату по юлианскому календарю.

Как в примере выше, мне нужно получить значение 032


person Thomas Koh    schedule 27.07.2018    source источник
comment
Без года, как вы справитесь с високосным годом? Под другими языками вы подразумеваете языки, отличные от английского или других языков программирования? Если вы можете ввести год, DateTime.DayOfYear может помочь.   -  person Mary    schedule 27.07.2018
comment
Количество дней в месяцах года такое же, как и в григорианском календаре, но високосные годы немного отличаются, потому что в нем не было 100-летнего исключения для високосных лет. Итак, как сказал @Mary, вам все равно нужно будет указать год.   -  person David Wilson    schedule 27.07.2018
comment
Я имею в виду, что с учетом года, месяца и дня юлианский день основан на ссылке, которую я дал только с 3-значными значениями, как мне это сделать, обычный онлайн-юлианский конвертер основан на дате с более чем 3-значными значениями после преобразования . Под другим языком я подразумеваю любые другие языки программирования, а также мне просто нужно изучить логику программирования преобразования. Подойдет любой язык программирования, но предпочтительно vb6 среда, над которой я работаю.   -  person Thomas Koh    schedule 27.07.2018
comment
Чтобы уточнить ваш вопрос, для даты 1 марта 1900 года результат должен быть 60 или 61?   -  person Gerard Ashton    schedule 27.07.2018


Ответы (3)


Вам нужен год, чтобы вы могли знать, какой день является датой.

person CruleD    schedule 27.07.2018

Класс .Net JulianCalendar предоставляет все методы, необходимые для достижения вашей цели. Он также виден COM, поэтому вы можете ссылаться на него в проекте VBA после добавления ссылки на проект в «mscorlib.dll».

В VB.Net код будет таким:

Dim jc As New System.Globalization.JulianCalendar
' create a gregorian equivalent of the julian date: 1 Feb 2018
Dim gregoriaDateEquivalent As DateTime = jc.ToDateTime(2018, 2, 1, 0, 0, 0, 0)
' = #2/14/2018 12:00:00 AM#
Dim dayOfYear As Int32 = jc.GetDayOfYear(gregoriaDateEquivalent)
' = 32

В VBA код будет таким:

Dim jc As mscorlib.JulianCalendar
Set jc = New mscorlib.JulianCalendar

' create a gregorian equivalent of the julian date: 1 Feb 2018
Dim gregoriaDateEquivalent As Date
gregoriaDateEquivalent = jc.ToDateTime(2018, 2, 1, 0, 0, 0, 0)
' = #2/14/2018
Dim dayOfYear As Long
dayOfYear = jc.GetDayOfYear(gregoriaDateEquivalent)
' = 32
person TnTinMn    schedule 27.07.2018
comment
@ThomasKoh, если это сработает, отметьте это как ответ. - person TnTinMn; 30.07.2018

Сначала вам нужно добавить ссылку на библиотеку mscorlib. В VB6, Project-References-> Установите флажок mscorlib

Создайте этот метод функции в объекте, который у вас есть, или иным образом создайте подпроцедуру.

Public Function JulianConverter() As String
        'MsgBox Fix(5.2), vbExclamation, App.Title
        'MsgBox Fix(5.6)
        Dim y As String
        Dim m As String
        Dim d As String
        Dim strDate As String
        Dim dateArray() As String


        strDate = Format(Now, "dd/MMM/yyyy")
        dateArray = Split(strDate, "/")
        d = dateArray(0)
        m = dateArray(1)
        y = dateArray(2)
        'Debug
        'MsgBox strDate

        'Convert to Integer
        y = Val(y)
        m = Val(m)
        d = Val(d)

        If m <= 2 Then
            y = y - 1
            m = m + 12
        End If

        'Dim A As Double
       ' Dim B As Double
        'Dim JD As Double

       ' A = CDbl(Fix(y / 100#))

        'B = 2 - A + Fix(A / 4)


        'JD = Fix(365.25 * (y + 4716)) + Fix(30.6001 * (m + 1)) + d + B - 1524.5
        'JulianConverter = CStr(JD) 'Convert to string

        Dim jc As mscorlib.JulianCalendar
Set jc = New mscorlib.JulianCalendar

' create a gregorian equivalent of the julian date: 1 Feb 2018
Dim gregoriaDateEquivalent As Date
gregoriaDateEquivalent = jc.ToDateTime(2018, m, d, 0, 0, 0, 0)
' = #2/14/2018
Dim dayOfYear As Long
Dim dayOfYearS As String
Dim digitLength As Integer
Dim Counter As Integer

dayOfYear = jc.GetDayOfYear(gregoriaDateEquivalent)

'Have to ensure 3 digits values
dayOfYearS = CStr(dayOfYear)

'Count number of Digits of string
digitLength = Len(dayOfYearS)

MsgBox "DigitLength" & digitLength, vbExclamation, App.Title

'If Digits length smaller than 3,add one 0 in front
If (digitLength < 3) Then
dayOfYearS = "0" & dayOfYearS
End If

JulianConverter = dayOfYearS

End Function

Это гарантирует, что юлианский день будет состоять из 3 цифр в зависимости от текущей системной даты.

person Thomas Koh    schedule 30.07.2018