@@ -355,6 +355,17 @@ static void add_update(struct market_info *info, int type, time_t timestamp)
355355 dict_add (info -> update , & key , NULL );
356356}
357357
358+ static time_t get_day_start (time_t timestamp )
359+ {
360+ struct tm * timeinfo = localtime (& timestamp );
361+ struct tm dtm ;
362+ memset (& dtm , 0 , sizeof (dtm ));
363+ dtm .tm_year = timeinfo -> tm_year ;
364+ dtm .tm_mon = timeinfo -> tm_mon ;
365+ dtm .tm_mday = timeinfo -> tm_mday ;
366+ return mktime (& dtm );
367+ }
368+
358369static int market_update (const char * market , double timestamp , mpd_t * price , mpd_t * amount , int side , uint64_t id )
359370{
360371 struct market_info * info = market_query (market );
@@ -415,7 +426,7 @@ static int market_update(const char *market, double timestamp, mpd_t *price, mpd
415426 add_update (info , KLINE_HOUR , time_hour );
416427
417428 // update day
418- time_t time_day = time_sec / 86400 * 86400 + settings . timezone ;
429+ time_t time_day = get_day_start ( time_sec ) ;
419430 entry = dict_find (info -> day , & time_day );
420431 if (entry ) {
421432 kinfo = entry -> val ;
@@ -935,7 +946,7 @@ json_t *get_market_status_today(const char *market)
935946
936947 json_t * result = json_object ();
937948 time_t now = time (NULL );
938- time_t start = now / 86400 * 86400 + settings . timezone ;
949+ time_t start = get_day_start ( now ) ;
939950 struct kline_info * klast = get_last_kline (info -> day , start - 86400 , start - 86400 * 30 , 86400 );
940951 dict_entry * entry = dict_find (info -> day , & start );
941952 if (entry ) {
@@ -1072,11 +1083,10 @@ json_t *get_market_kline_hour(const char *market, time_t start, time_t end, int
10721083 time_t start_min = now / 3600 * 3600 - settings .hour_max * 3600 ;
10731084 if (start < start_min )
10741085 start = start_min ;
1075- time_t base = start / 86400 * 86400 - 86400 + settings . timezone ;
1076- while (base <= start ) {
1086+ time_t base = get_day_start ( start ) ;
1087+ while (( base + interval ) <= start )
10771088 base += interval ;
1078- }
1079- start = base - interval ;
1089+ start = base ;
10801090
10811091 struct kline_info * klast = get_last_kline (info -> hour , start - 3600 , start_min , 3600 );
10821092 int step = interval / 3600 ;
@@ -1112,10 +1122,7 @@ json_t *get_market_kline_day(const char *market, time_t start, time_t end, int i
11121122 return NULL ;
11131123
11141124 json_t * result = json_array ();
1115- time_t base = start / interval * interval + settings .timezone ;
1116- if (base > start )
1117- base -= interval ;
1118- start = base ;
1125+ start = (start - settings .timezone ) / interval * interval + settings .timezone ;
11191126
11201127 struct kline_info * klast = get_last_kline (info -> day , start - 86400 , start - 86400 * 30 , 86400 );
11211128 int step = interval / 86400 ;
@@ -1151,10 +1158,10 @@ json_t *get_market_kline_week(const char *market, time_t start, time_t end, int
11511158 return NULL ;
11521159
11531160 json_t * result = json_array ();
1154- time_t base = start / interval * interval - 3 * 86400 + settings .timezone ;
1155- while (base <= start )
1161+ time_t base = ( start - settings . timezone ) / interval * interval - 3 * 86400 + settings .timezone ;
1162+ while (( base + interval ) <= start )
11561163 base += interval ;
1157- start = base - interval ;
1164+ start = base ;
11581165
11591166 struct kline_info * klast = get_last_kline (info -> day , start - 86400 , start - 86400 * 30 , 86400 );
11601167 int step = interval / 86400 ;
0 commit comments