mirror of
https://github.com/quantum5/qcal.git
synced 2025-04-24 17:51:57 -04:00
Add JDN to French Republican calculation
This commit is contained in:
parent
d366604665
commit
2c3657248b
|
@ -1,7 +1,7 @@
|
|||
import React from 'react';
|
||||
import './App.css';
|
||||
import {Calendar} from './Calendar';
|
||||
import {gregorianJDN, Month} from "./dates";
|
||||
import {gregorianJDN, jdnFrench, Month} from "./dates";
|
||||
|
||||
type YearMonth = {
|
||||
year: number;
|
||||
|
@ -28,12 +28,13 @@ class App extends React.Component<{}, AppState> {
|
|||
|
||||
constructor(props: {}) {
|
||||
super(props);
|
||||
const current = {year: 230, month: 5};
|
||||
const today = new Date();
|
||||
const todayJDN = gregorianJDN(today.getFullYear(), today.getMonth() + 1, today.getDay());
|
||||
const {year, month} = jdnFrench(todayJDN);
|
||||
|
||||
this.state = {
|
||||
...(parseURL() || current as YearMonth),
|
||||
todayJDN: gregorianJDN(today.getFullYear(), today.getMonth() + 1, today.getDay()),
|
||||
...(parseURL() || {year, month}),
|
||||
todayJDN,
|
||||
};
|
||||
this.updateURL();
|
||||
this.updateStateFromURL = this.updateStateFromURL.bind(this);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import {dateName, frJDN, gregorianJDN, jdnGregorian, jdnLongCount, monthName} from './dates';
|
||||
import {dateName, frJDN, gregorianJDN, jdnFrench, jdnGregorian, jdnLongCount, monthName} from './dates';
|
||||
|
||||
describe('gregorianJDN', () => {
|
||||
it('works', () => {
|
||||
|
@ -30,6 +30,22 @@ describe('frJDN', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('jdnFrench', () => {
|
||||
it('works for sample dates', () => {
|
||||
expect(jdnFrench(2375840)).toEqual({year: 1, month: 1, day: 1});
|
||||
expect(jdnFrench(2378444)).toEqual({year: 8, month: 2, day: 18});
|
||||
});
|
||||
|
||||
it('works in years starting/ending near midnight', () => {
|
||||
expect(jdnFrench(2416017)).toEqual({year: 111, month: 1, day: 1});
|
||||
expect(jdnFrench(2450715)).toEqual({year: 206, month: 1, day: 1});
|
||||
expect(jdnFrench(3284926)).toEqual({year: 2490, month: 1, day: 1});
|
||||
expect(jdnFrench(2416016)).toEqual({year: 110, month: 13, day: 6});
|
||||
expect(jdnFrench(2450714)).toEqual({year: 205, month: 13, day: 6});
|
||||
expect(jdnFrench(3284925)).toEqual({year: 2489, month: 13, day: 5});
|
||||
});
|
||||
});
|
||||
|
||||
describe('jdnGregorian', () => {
|
||||
it('works', () => {
|
||||
expect(jdnGregorian(0)).toEqual(new Date(-4713, 10, 24));
|
||||
|
|
26
src/dates.ts
26
src/dates.ts
|
@ -34,10 +34,10 @@ export type Day =
|
|||
| 29
|
||||
| 30;
|
||||
|
||||
export type GregorianDate = {
|
||||
export type FrenchDate = {
|
||||
year: number,
|
||||
month: number,
|
||||
day: number,
|
||||
month: Month,
|
||||
day: Day,
|
||||
};
|
||||
|
||||
const monthNames: {
|
||||
|
@ -96,6 +96,26 @@ export function jdnGregorian(jdn: number): Date {
|
|||
return new Date(year, month - 1, day);
|
||||
}
|
||||
|
||||
export function jdnFrench(jdn: number): FrenchDate {
|
||||
let lo = 0;
|
||||
let hi = leaps.length;
|
||||
|
||||
while (lo + 1 < hi) {
|
||||
const mid = Math.floor((lo + hi) / 2);
|
||||
if (startJD + 365 * mid + leaps[mid] <= jdn)
|
||||
lo = mid;
|
||||
else
|
||||
hi = mid;
|
||||
}
|
||||
|
||||
const dd = jdn - (startJD + 365 * lo + leaps[lo]);
|
||||
return {
|
||||
year: startYear + lo,
|
||||
month: Math.floor(dd / 30) + 1 as Month,
|
||||
day: dd % 30 + 1 as Day,
|
||||
}
|
||||
}
|
||||
|
||||
export function jdnLongCount(jdn: number): string | null {
|
||||
let z = jdn - 584283;
|
||||
if (z < 0)
|
||||
|
|
Loading…
Reference in a new issue