Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > преобразование юлианской даты


Автор: nas_alex 21.11.2005, 11:27
добрый день.


подскажите как преобразовать юлианскую дату в нормальную ?

Автор: _hunter 21.11.2005, 12:01
примерно так:
http://forum.vingrad.ru/index.php?showtopic=69759

Автор: Dmitriy2k 21.11.2005, 22:44
Не знаю,что такое Юлианская дата, но вот когда разбирал коды на 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

Автор: nas_alex 25.11.2005, 13:07
делаю так

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

Автор: _hunter 25.11.2005, 13:13
что ты под результатом подразумеваеш?

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

то что выводиться в printf

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

то, что возвращает оператор printf

Автор: _hunter 25.11.2005, 15:51
так выаоди или возвращает?
+ почему ты через %s пишеш если там число? через %d нужно

Автор: nas_alex 25.11.2005, 16:02
да, мой косяк....


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

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

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

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

почему так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)