Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
34 / 3 / 2
Регистрация: 18.04.2015
Сообщений: 50
1

Функции преобразования Григорианской даты в Юлианскую

23.03.2016, 00:09. Просмотров 3957. Ответов 1
Метки нет (Все метки)


Всем привет.
Возникла проблема преобразования Григорианской даты дд.мм.гггг (обычной даты которой мы постоянно пользуемся)
в Юлианскую дд.мм.гггг.
Причем мне не нужно преобразовывать Григорианскую даты в день Юлианский, а нужно именно в дату!!!
Такого мне не нужно. На выходе должно быть обычное представление дд.мм.гггг .
Кто может подкинуть алгоритм или сразу код чтобы не делать велосипед?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2016, 00:09
Ответы с готовыми решениями:

Пересчёт даты из Григорианской в Юлианскую
Пишу программу по астрономии, необходимо пересчитать Григорианскую дату в Юлианскую. Вот что...

Перевод григорианской даты в юлианскую
Программа перевода из Григорианского календаря в Юлианский. У меня нет никаких идей по этому...

MSSQL: преобразования формата даты
В базе MS SQL хранятся даты вида: '2011.03.28 11:02:58' . Когда я хочу вывести эти данные в...

Избежать автоматического преобразования даты в DGV
Подскажите как правильно настроить формат в datagridview, считываются данные из базы нормально, но...

1
34 / 3 / 2
Регистрация: 18.04.2015
Сообщений: 50
24.03.2016, 19:31  [ТС] 2
Лучший ответ Сообщение было отмечено GuPixD как решение

Решение

Радуемся и хлопаем в ладоши.

файл juliandate.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#pragma once
#ifndef _JULIANDATE_H_
#define _JULIANDATE_H_
 
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <vector>
 
#define PRINT_ERROR(msg) cout   << "ERROR: '" << msg << "' IN FILE: " << __FILE__ \
                << ":" << __LINE__ << endl; exit(EXIT_FAILURE);
 
using namespace std;
 
class CJulianDate
{
public:
    CJulianDate() { };
    ~CJulianDate() { };
 
    // Перевод обычной даты в юлианскую
    double DateToJD(vector<int> date);
    double DateToJD( int day ,int month, int year);
 
    //Перевод Юлианского дня в Юлианскую дату
    vector<int> JDToJulian(double juliandate);
 
    //Перевод Юлианской даты в Юлианскую день
    double JulianToJD(int day, int month, int year);
 
    // Перевод Юлианского дня в Григорианского дату
    vector<int> JDToDate(double juliandate);
 
private:
    // Проверка даты
    void check_date(int day, int month, int year);
};
#endif
файл juliandate.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "stdafx.h"
#include "juliandate.h"
#include <iostream>
#include <math.h>
 
//----------------------------------------------------------------------------//
//                     Перевод обычной даты в Юлианский день                  //
//----------------------------------------------------------------------------//
double CJulianDate::DateToJD(vector<int> date)
{
    return DateToJD(date[0], date[1], date[2]);
}
//----------------------------------------------------------------------------//
//                      Перевод обычной даты в Юлианский день                 //
//----------------------------------------------------------------------------//
double CJulianDate::DateToJD(int day, int month, int year)
{
    double jd;
    check_date(day, month, year);
 
 
    double ggg = 1;
    if (year < 1582) { ggg = 0; }
    if (year <= 1582 && month < 10) { ggg = 0; }
    if (year <= 1582 && month == 10 && day < 5) { ggg = 0; }
    jd = -1 * (int)(7 * ((int)((month + 9) / 12) + year) / 4);
 
    int s = 1;
    if ((month - 9) < 0) { s = -1; }
    int a = month - 9;
    if (a < 0) { a *= -1; }
    double j1 = (int)(year + s * (int)(a / 7));
    j1 = -1 * (int)((floor(j1 / 100) + 1) * 3 / 4);
    jd = jd + (int)(275 * month / 9) + day + (ggg * j1);
    jd = jd + 1721027 + 2 * ggg + 367 * year - 0.5;
 
    return jd;
}
//----------------------------------------------------------------------------//
//                Перевод Юлианского дня в Юлианскую дату                    //
//----------------------------------------------------------------------------//
vector<int> CJulianDate::JDToJulian(double juliandate)
{
    double JD = juliandate;
    double  alpha, c, d, e;
    int day, month, year, z, a, b;
 
    JD += 0.5;
    z = floor(JD);
    a = z;
    b = a + 1524;
    c = floor((b - 122.1) / 365.25);
    d = floor(365.25 * c);
    e = floor((b - d) / 30.6001);
 
    month = floor((e < 14) ? (e - 1) : (e - 13));
    year = floor((month > 2) ? (c - 4716) : (c - 4715));
    day = b - d - floor(30.6001 * e);
 
    /*  If year is less than 1, subtract one to convert from
    a zero based date system to the common era system in
    which the year -1 (1 B.C.E) is followed by year 1 (1 C.E.).  */
 
    if (year < 1) {year--;}
 
    vector<int> date;
    date.push_back((int)day);
    date.push_back((int)month);
    date.push_back((int)year);
    return date;
}
//----------------------------------------------------------------------------//
//             Перевод Юлианской даты в Юлианскую день                        //
//----------------------------------------------------------------------------//
double CJulianDate::JulianToJD(int day, int month, int year)
{
    /* Adjust negative common era years to the zero-based notation we use.  */
    if (year < 1) 
    {
        year++;
    }   
    if (month <= 2) 
    {
        year--;
        month += 12;
    }
    return ((floor((365.25 * (year + 4716))) +
             floor((30.6001 * (month + 1))) +
                                     day) - 1524.5);
}
//----------------------------------------------------------------------------//
//           Перевод Юлианского дня в Григорианского дату                    //
//----------------------------------------------------------------------------//
vector<int> CJulianDate::JDToDate(double juliandate)
{
    double JD = juliandate;
 
    double A, I, B, C, D, T, RJ, day , RH, month, year;
    double Z = floor(JD + 0.5);
    double F = JD + 0.5 - Z;
    if (Z < 2299161) { A = Z; }
    else
    {
        I = floor((Z - 1867216.25) / 36524.25);
        A = Z + 1 + I - floor(I / 4);
    }
    B = A + 1524;
    C = floor((B - 122.1) / 365.25);
    D = floor(365.25 * C);
    T = floor((B - D) / 30.600);
    RJ = B - D - floor(30.6001 * T) + F;
    day = floor(RJ);
    RH = (RJ - floor(RJ)) * 24;
 
 
    if (T < 14) { month = T - 1; }
    else
    {
        if ((T == 14) || (T == 15)) { month = T - 13; }
    }
 
    if (month > 2) { year = C - 4716; }
    else
    {
        if ((month == 1) || (month == 2)) { year = C - 4715; }
    }
 
    vector<int> date;
    date.push_back((int)day);
    date.push_back((int)month);
    date.push_back((int)year);
 
    return date;
}
//----------------------------------------------------------------------------//
//                             Проверка даты                                  //
//----------------------------------------------------------------------------//
void CJulianDate::check_date(int day, int month, int year)
{
    if (month > 12 || month < 1) { PRINT_ERROR("ERROR: Month must be 1,2,3,...,12"); }
    if (day   > 31 || day   < 0) { PRINT_ERROR("Day > 31"); }
    system("pause");
}
Пользуемся в удовольствие и перестаем делать велосипеды.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2016, 19:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Программка с запросом даты у пользователя и ее преобразования
Добрый день всем. Хочу создать мини-программку, которая бы заменяла любую введеную дату, например...

Метод преобразования даты в целое число
Подскажите, как написать в console application метод int metod(string str) Параметром в этом...

Ошибка преобразования даты или времени из символьной строки
Всем привет. Написал хранимую процедуру, для выборки данных. Проблемы по поиску по дате ALTER...

Ошибка преобразования даты или времени из символьной строки
На другой версии все работает, SQL Manager 2014 не хочет. Вот собственно сам кусок кода: insert...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.