Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование юлианской даты, преобразование юлианской даты 
:(
    Опции темы
nas_alex
  Дата 21.11.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



добрый день.


подскажите как преобразовать юлианскую дату в нормальную ?
PM MAIL   Вверх
_hunter
Дата 21.11.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Dmitriy2k
Дата 21.11.2005, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Не знаю,что такое Юлианская дата, но вот когда разбирал коды на VB,
там время и дата в переменной типа DOUBLE приходилось писать что то типа
Код

.....h......

#include <string.h>
#include <stdio.h>
#include <math.h>

#define LENDATE 50
#define M1 11.574
typedef unsigned char BYTE;

BYTE *getDate(double);
.....cpp...............

#include "55date.h"

double getYearsInDays(double days, int *ost, int *vis)
{
  int Year=1900;
  double ddays=0;
  int dci;

  if(days<0) {Year--; dci=-1;}
  else dci=1;

  while(-1)
  {
     *vis=0;
     if (((Year%4) == 0) && ((Year %100)!=0) || ((Year % 400)==0))
     {
       ddays+=dci;
       *vis=1;
     }
     ddays+=(365*dci);
     if (dci>=0){if (ddays<days) Year+=dci;else break;}
     else{if (ddays>days) Year+=dci;else break;}

  }
  if (days<0) *ost=(int)(days+*vis - ddays);
  else *ost=(int)(days+*vis+365 - ddays);

  return Year;
}
int getMonthsInDays(int days, int *ost, int vis)
{
  int Month=1;
  int iDays=0;
  int iDaysMonth;
  while(-1)
  {
     switch(Month)
     {
       case 4: case 6: case 9: case 11:
     iDaysMonth=30;
     break;
       case 2:
     iDaysMonth=28;
     if (vis==1) iDaysMonth++;
     break;
       default:
     iDaysMonth=31;
     }
     if ((iDays+iDaysMonth)>=days) break;
     iDays+=iDaysMonth;
     Month++;
  }
  *ost = days-iDays;
  return Month;
}

BYTE *getOnlyDate(double date)
{
   BYTE out[LENDATE];
   int days,
       months,
       years;
  int ostat,vis=1;

  if (date>0) years=(int)(getYearsInDays(date-1,&ostat,&vis));
  else years=(int)(getYearsInDays(date-1,&ostat,&vis));
  months=(int)(getMonthsInDays(ostat,&ostat,vis));
  days=(int)ostat;
  sprintf(out,"%i/%i/%i",days,months,years);
  return strdup(out);
}

BYTE *getOnlyTime(double time)
{
   BYTE out[LENDATE];
   int hours=4,
       minets=35,
       seconds=17;
   double ostat;
   double del1,del2,del3;

   time*=1000000;
   del1=(double)60*60*M1;
   del2=(double)60*M1;
   del3=(double)M1;

   hours=(int)(time/del1);
    ostat=fmod(time,del1);
   minets=(int)(ostat/del2);
    ostat=fmod(ostat,del2);
   seconds=(int)(ostat/del3);
   sprintf(out,"%i:%i:%i",hours,minets,seconds);
   return strdup(out);
}

BYTE *getDateAndTime(double date,double time)
{
   BYTE out[LENDATE];
   strcpy(out,getOnlyDate(date));
   strcat(out,";");
   strcat(out,getOnlyTime(time));
   return strdup(out);
}

BYTE *getDate(double ddate)
{
  double getYearsInDays(double days, int *ost, int *vis);
  int getMonthsInDays(int days, int *ost,int vis);
  BYTE *getOnlyDate(double);
  BYTE *getOnlyTime(double);
  BYTE *getDateAndTime(double date, double time);

  BYTE out[LENDATE];
  double fraction, integer;

  fraction = modf(ddate, &integer);

  if ((integer!=0)&&(fraction==0))
      strcpy(out,getOnlyDate(integer));
  if ((integer==0)&&(fraction!=0))
      strcpy(out,getOnlyTime(fraction));
  if ((integer!=0)&&(fraction!=0))
      strcpy(out,getDateAndTime(integer,fraction));
  return strdup(out);
}



Может это поможет smile
PM MAIL   Вверх
nas_alex
Дата 25.11.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



делаю так

struct tm newtime;
time_t now, result;

time( &now );
newtime = *localtime( &now );
newtime.tm_yday = 1;
result = mktime( &newtime );
char aaa=newtime.tm_yday;
printf("%s\n",aaa);


результат - NULL

не подскажете почему?
по идее должен вернуть 1

PM MAIL   Вверх
_hunter
Дата 25.11.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



что ты под результатом подразумеваеш?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
nas_alex
Дата 25.11.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



Цитата(_hunter @ 25.11.2005, 13:13)
что ты под результатом подразумеваеш?

то что выводиться в printf
PM MAIL   Вверх
nas_alex
Дата 25.11.2005, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



Цитата(_hunter @ 25.11.2005, 13:13)
что ты под результатом подразумеваеш?

то, что возвращает оператор printf
PM MAIL   Вверх
_hunter
Дата 25.11.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



так выаоди или возвращает?
+ почему ты через %s пишеш если там число? через %d нужно


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
nas_alex
Дата 25.11.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



да, мой косяк....


но все равно возвращает 0.

может я чего не понимаю?

newtime.tm_yday = 1;
tm_yday - день в году 0-365

если я присваиваю 1, то должна быть дата 2 января, но возвращает 1 января.

почему так?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.