echs_idiff_t echs_instant_diff(echs_instant_t end, echs_instant_t beg) { int extra_df; int intra_df; /* just see what the intraday part yields for the difference */ intra_df = end.H - beg.H; intra_df *= 60; intra_df += end.M - beg.M; intra_df *= 60; intra_df += end.S - beg.S; intra_df *= 1000; intra_df += end.ms - beg.ms; if (intra_df < 0) { intra_df += 24 * 60 * 60 * 1000; extra_df = -1; } else if (intra_df < 24 * 60 * 60 * 1000) { extra_df = 0; } else { extra_df = 1; } { unsigned int dom_end = __doy(end); unsigned int dom_beg = __doy(beg); int df_y = end.y - beg.y; if ((extra_df += dom_end - dom_beg) < 0) { df_y--; } extra_df += df_y * 365 + (df_y - 1) / 4; } return (echs_idiff_t){extra_df, intra_df}; }
echs_idiff_t echs_instant_diff(echs_instant_t end, echs_instant_t beg) { int extra_df; int intra_df; /* just see what the intraday part yields for the difference */ intra_df = end.H - beg.H; intra_df *= MINS_PER_HOUR; intra_df += end.M - beg.M; intra_df *= SECS_PER_MIN; intra_df += end.S - beg.S; intra_df *= MSECS_PER_SEC; intra_df += end.ms - beg.ms; if (intra_df < 0) { intra_df += MSECS_PER_DAY; extra_df = -1; } else if ((unsigned int)intra_df < MSECS_PER_DAY) { extra_df = 0; } else { extra_df = 1; } { unsigned int dsi_end = __jan00(end.y); unsigned int dsi_beg = __jan00(beg.y); unsigned int doy_end = __doy(end); unsigned int doy_beg = __doy(beg); extra_df += dsi_end - dsi_beg; extra_df += doy_end - doy_beg; } return (echs_idiff_t){extra_df * MSECS_PER_DAY + intra_df}; }