Skip to content

Instantly share code, notes, and snippets.

@dannylagrouw
Last active September 1, 2017 14:06
Show Gist options
  • Save dannylagrouw/12f7a425363221a870a9a7471bdfd327 to your computer and use it in GitHub Desktop.
Save dannylagrouw/12f7a425363221a870a9a7471bdfd327 to your computer and use it in GitHub Desktop.
Parse Dutch written date
"use strict";
function findMonth(s) {
var MONTHS = ['januari', 'februari', 'maart', 'april',
'mei', 'juni', 'juli', 'augustus', 'september',
'oktober', 'november', 'december'];
return MONTHS.reduce(function (result, month, index) {
var i = s.indexOf(month);
if (i >= 0) {
return [month, index, i];
}
else {
return result;
}
}, undefined);
}
function parseNumberBelow100(s) {
var NUMBERS = ['een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen', 'tien',
'elf', 'twaalf', 'dertien', 'veertien', 'vijftien',
'zestien', 'zeventien', 'achttien', 'negentien'];
var UNITS = ['een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen'];
var TENS = ['twintig', 'dertig', 'veertig', 'vijftig', 'zestig', 'zeventig',
'tachtig', 'negentig'];
var index = NUMBERS.indexOf(s);
if (index >= 0) {
return index + 1;
}
index = TENS.findIndex(function (ten) { return s === ten; });
if (index >= 0) {
return (index + 2) * 10;
}
index = TENS.reduce(function (result, ten, tenIndex) {
var unitIndex = UNITS.findIndex(function (unit) { return s === unit + 'en' + ten; });
if (unitIndex >= 0) {
return (tenIndex + 2) * 10 + (unitIndex + 1);
}
else {
return result;
}
}, undefined);
return index;
}
function parseDay(s) {
return parseNumberBelow100(s);
}
function parseYear(s) {
var hundreds = 0;
var thousands = 0;
var restIndex = -1;
var rest = 0;
var index100 = s.indexOf('honderd');
if (index100 === 0) {
hundreds = 1;
}
else if (index100 > 0) {
hundreds = parseNumberBelow100(s.substring(0, index100));
}
else {
var index1000 = s.indexOf('duizend');
if (index1000 === 0) {
thousands = 1;
}
else if (index1000 > 0) {
thousands = parseNumberBelow100(s.substring(0, index1000));
}
}
if (index100 >= 0) {
restIndex = index100 + 7;
}
else if (index1000 >= 0) {
restIndex = index1000 + 7;
}
if (restIndex !== -1 && restIndex < s.length) {
rest = parseNumberBelow100(s.substring(restIndex).trim());
}
return (thousands * 1000) + (hundreds * 100) + rest;
}
function parseDate(s) {
var monthInfo = findMonth(s);
if (monthInfo) {
var monthStr = monthInfo[0], month = monthInfo[1], monthPos = monthInfo[2];
var dayStr = s.substring(0, monthPos).trim();
var day = parseDay(dayStr);
var yearStr = s.substring(monthPos + monthStr.length).trim();
var year = parseYear(yearStr);
}
return new Date(year, month, day);
}
console.log(parseDate('negenentwintig oktober negentienhonderdvierenzeventig').toString());
console.log(parseDate('twaalf januari negentienhonderd').toString());
console.log(parseDate('eenendertig maart tweeduizend veertien').toString());
console.log(parseDate('drie december tweeduizend').toString());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment