date.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. function parseNumber(s) {
  2. return parseInt(s, 10);
  3. }
  4. //in seconds
  5. var hours = 3600;
  6. var minutes = 60;
  7. //take date (year, month, day) and time (hour, minutes, seconds) digits in UTC
  8. //and return a timestamp in seconds
  9. function parseDateTimeParts(dateParts, timeParts) {
  10. dateParts = dateParts.map(parseNumber);
  11. timeParts = timeParts.map(parseNumber);
  12. var year = dateParts[0];
  13. var month = dateParts[1] - 1;
  14. var day = dateParts[2];
  15. var hours = timeParts[0];
  16. var minutes = timeParts[1];
  17. var seconds = timeParts[2];
  18. var date = Date.UTC(year, month, day, hours, minutes, seconds, 0);
  19. var timestamp = date / 1000;
  20. return timestamp;
  21. }
  22. //parse date with "2004-09-04T23:39:06-08:00" format,
  23. //one of the formats supported by ISO 8601, and
  24. //convert to utc timestamp in seconds
  25. function parseDateWithTimezoneFormat(dateTimeStr) {
  26. var dateParts = dateTimeStr.substr(0, 10).split('-');
  27. var timeParts = dateTimeStr.substr(11, 8).split(':');
  28. var timezoneStr = dateTimeStr.substr(19, 6);
  29. var timezoneParts = timezoneStr.split(':').map(parseNumber);
  30. var timezoneOffset = (timezoneParts[0] * hours) +
  31. (timezoneParts[1] * minutes);
  32. var timestamp = parseDateTimeParts(dateParts, timeParts);
  33. //minus because the timezoneOffset describes
  34. //how much the described time is ahead of UTC
  35. timestamp -= timezoneOffset;
  36. if(typeof timestamp === 'number' && !isNaN(timestamp)) {
  37. return timestamp;
  38. }
  39. }
  40. //parse date with "YYYY:MM:DD hh:mm:ss" format, convert to utc timestamp in seconds
  41. function parseDateWithSpecFormat(dateTimeStr) {
  42. var parts = dateTimeStr.split(' '),
  43. dateParts = parts[0].split(':'),
  44. timeParts = parts[1].split(':');
  45. var timestamp = parseDateTimeParts(dateParts, timeParts);
  46. if(typeof timestamp === 'number' && !isNaN(timestamp)) {
  47. return timestamp;
  48. }
  49. }
  50. function parseExifDate(dateTimeStr) {
  51. //some easy checks to determine two common date formats
  52. //is the date in the standard "YYYY:MM:DD hh:mm:ss" format?
  53. var isSpecFormat = dateTimeStr.length === 19 &&
  54. dateTimeStr.charAt(4) === ':';
  55. //is the date in the non-standard format,
  56. //"2004-09-04T23:39:06-08:00" to include a timezone?
  57. var isTimezoneFormat = dateTimeStr.length === 25 &&
  58. dateTimeStr.charAt(10) === 'T';
  59. var timestamp;
  60. if(isTimezoneFormat) {
  61. return parseDateWithTimezoneFormat(dateTimeStr);
  62. }
  63. else if(isSpecFormat) {
  64. return parseDateWithSpecFormat(dateTimeStr);
  65. }
  66. }
  67. module.exports = {
  68. parseDateWithSpecFormat: parseDateWithSpecFormat,
  69. parseDateWithTimezoneFormat: parseDateWithTimezoneFormat,
  70. parseExifDate: parseExifDate
  71. };