Add more date format options

Closes #94
This commit is contained in:
Brandon Presley 2022-10-28 15:49:03 +13:00
parent 6d6a6f7a20
commit ac0af26f77
4 changed files with 59 additions and 16 deletions

View File

@ -5,6 +5,7 @@ import {Divider, List, Menu, Text} from 'react-native-paper';
import {HomePageParams} from './home-page-params'; import {HomePageParams} from './home-page-params';
import Set from './set'; import Set from './set';
import {deleteSet} from './set.service'; import {deleteSet} from './set.service';
import {format} from './time';
import useDark from './use-dark'; import useDark from './use-dark';
import {useSettings} from './use-settings'; import {useSettings} from './use-settings';
@ -63,7 +64,7 @@ export default function SetItem({
alignSelf: 'center', alignSelf: 'center',
color: dark ? '#909090ff' : '#717171ff', color: dark ? '#909090ff' : '#717171ff',
}}> }}>
{item.created?.replace('T', ' ')} {format(item.created || '', settings.date)}
</Text> </Text>
)} )}
<Menu <Menu

View File

@ -228,16 +228,18 @@ export default function SettingsPage() {
dropdownIconColor={color} dropdownIconColor={color}
selectedValue={settings.date} selectedValue={settings.date}
onValueChange={changeDate}> onValueChange={changeDate}>
<Picker.Item value="%Y-%m-%d %H:%M" label="1990-12-24 15:05" />
<Picker.Item value="%Y-%m-%d" label="1990-12-24" />
<Picker.Item value="%d/%m" label="24/12 (dd/MM)" />
<Picker.Item value="%H:%M" label="15:05 (24-hour time)" />
<Picker.Item value="%h:%M %p" label="3:05 PM (12-hour time)" />
<Picker.Item value="%d/%m/%y" label="24/12/1996" />
<Picker.Item value="%A %h:%M %p" label="Monday 3:05 PM" />
<Picker.Item <Picker.Item
value="%Y-%m-%d %H:%M" value="%d/%m/%y %h:%M %p"
label="Format date as 1990-12-24 15:05" label="24/12/1990 3:05 PM"
/> />
<Picker.Item <Picker.Item value="%d/%m %h:%M %p" label="24/12 3:05 PM" />
value="%Y-%m-%d"
label="Format date as 1990-12-24 (YYYY-MM-dd)"
/>
<Picker.Item value="%d/%m" label="Format date as 24/12 (dd/MM)" />
<Picker.Item value="%H:%M" label="Format date as 15:05 (HH:MM)" />
</Picker> </Picker>
)} )}
{'alarm sound'.includes(search.toLowerCase()) && ( {'alarm sound'.includes(search.toLowerCase()) && (

View File

@ -82,18 +82,13 @@ export const getSets = async ({
}: PageParams): Promise<Set[]> => { }: PageParams): Promise<Set[]> => {
const select = ` const select = `
SELECT id, name, reps, weight, sets, minutes, seconds, SELECT id, name, reps, weight, sets, minutes, seconds,
STRFTIME(?, created) as created, unit, image, steps created, unit, image, steps
FROM sets FROM sets
WHERE name LIKE ? AND NOT hidden WHERE name LIKE ? AND NOT hidden
ORDER BY STRFTIME('%Y-%m-%d %H:%M', created) DESC ORDER BY STRFTIME('%Y-%m-%d %H:%M', created) DESC
LIMIT ? OFFSET ? LIMIT ? OFFSET ?
`; `;
const [result] = await db.executeSql(select, [ const [result] = await db.executeSql(select, [`%${search}%`, limit, offset]);
format,
`%${search}%`,
limit,
offset,
]);
return result.rows.raw(); return result.rows.raw();
}; };

45
time.ts
View File

@ -14,3 +14,48 @@ export function formatMonth(iso: string) {
const mm = (date.getMonth() + 1).toString(); const mm = (date.getMonth() + 1).toString();
return `${dd}/${mm}`; return `${dd}/${mm}`;
} }
function twelveHour(twentyFourHour: string) {
const [hourString, minute] = twentyFourHour.split(':');
const hour = +hourString % 24;
return (hour % 12 || 12) + ':' + minute + (hour < 12 ? ' AM' : ' PM');
}
function dayOfWeek(iso: string) {
const date = new Date(iso);
const day = date.getDay();
const target = DAYS[day === 0 ? 0 : day - 1];
return target.slice(0, 3);
}
/**
* @param iso ISO formatted date, e.g. 1996-12-24T14:03:04
* @param kind Intended format for the date, e.g. '%Y-%m-%d %H:%M'
*/
export function format(iso: string, kind: string) {
const split = iso.split('T');
const [year, month, day] = split[0].split('-');
const time = twelveHour(split[1]);
switch (kind) {
case '%Y-%m-%d %H:%M':
return iso.replace('T', ' ').replace(/:\d{2}/, '');
case '%Y-%m-%d':
return split[0];
case '%H:%M':
return split[1].replace(/:\d{2}/, '');
case '%d/%m/%y %h:%M %p':
return `${day}/${month}/${year} ${time}`;
case '%d/%m %h:%M %p':
return `${day}/${month} ${time}`;
case '%d/%m/%y':
return `${day}/${month}/${year}`;
case '%d/%m':
return `${day}/${month}`;
case '%h:%M %p':
return time;
case '%A %h:%M %p':
return dayOfWeek(iso) + ' ' + time;
default:
return iso;
}
}