Sunday, February 27, 2022

[SOLVED] Unix timestamp with only month and year

Issue

I have an array of different dates but they only include the month and the year. Is there a way to get the unix timestamp just from those two things? I have to iterate over the array to get all the timestamps. I have the solution but the solution is ugly and long. Is there a simpler/easier way to reduce the amount of code I have?

for(var i=0, len = arr.length; i < len; i++){
        arr[i]['newDate'] = [];
        var jan = day * 31;
        var year = 31556926;
        var day = 86400;
        if(arr[i].post_date.includes("Janurary")){
            //january
            var str = arr[i].post_date.substr(8);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = jan + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("February")){
            //february
            var str = arr[i].post_date.substr(8);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = feb + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("March")){
            //march
            var str = arr[i].post_date.substr(6);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = mar + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("April")){
            //april
            var str = arr[i].post_date.substr(6);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = apr + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("May")){
            //may
            var str = arr[i].post_date.substr(4);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = may + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("June")){
            //june
            var str = arr[i].post_date.substr(5);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = jun + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("July")){
            //july
            var str = arr[i].post_date.substr(5);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = jul + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("August")){
            //august
            var str = arr[i].post_date.substr(7);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = aug + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("September")){
            //september
            var str = arr[i].post_date.substr(10);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = sep + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("October")){
            //october
            var str = arr[i].post_date.substr(8);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = oct + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("November")){
            //november
            var str = arr[i].post_date.substr(9);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = nov + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }
        if(arr[i].post_date.includes("December")){
            //december
            var str = arr[i].post_date.substr(9);
            var current = parseInt(str);
            var yearTotal = (current - 1970) * year;
            var unix = dec + yearTotal;
            var dateString = "@" + unix.toString();
            arr[i].newDate.push(dateString);
        }

        var jan = day * 31;
        var feb = day * 28;
        var mar = day * 31;
        var apr = day * 30;
        var may = day * 31;
        var jun = day * 30;
        var jul = day * 31;
        var aug = day * 31;
        var sep = day * 30;
        var oct = day * 31;
        var nov = day * 30;
        var dec = day * 31; 
    }

my array looks like this

var arr = [
    {
      "post_title": "title",
      "post_date": "December 2021"
    },
    {
      "post_title": "title",
      "post_date": "November 2021"
    },
    {
      "post_title": "title",
      "post_date": "October 2021"
    },
    {
      "post_title": "title",
      "post_date": "September 2021"
    },
    {
      "post_title": "title",
      "post_date": "August 2021"
    },
    {
      "post_title": "title",
      "post_date": "July 2021"
    },
    {
      "post_title": "title",
      "post_date": "June 2021"
    }
]

My result looks like

var arr = [
    {
      "post_title": "title",
      "post_date": "December 2021",
      "newDate": [
        "@1612081626"
      ]
    },
    {
      "post_title": "title",
      "post_date": "November 2021",
      "newDate": [
        "@1611995226"
      ]
    },
    {
      "post_title": "title",
      "post_date": "October 2021",
      "newDate": [
        "@1612081626"
      ]
    },
    {
      "post_title": "title",
      "post_date": "September 2021",
      "newDate": [
        "@1611995226"
      ]
    },
    {
      "post_title": "title",
      "post_date": "August 2021",
      "newDate": [
        "@1612081626"
      ]
    },
    {
      "post_title": "title",
      "post_date": "July 2021",
      "newDate": [
        "@1612081626"
      ]
    },
    {
      "post_title": "title",
      "post_date": "June 2021",
      "newDate": [
        "@1611995226"
      ]
    }
]

Solution

You can simply create a new Date() using the month (converted to an index) and year from the string.

Here using an array of months to convert the named month to an index, and dividing the result by 1000 since javascript stores times in milliseconds while unix uses seconds.

const arr = [{ post_title: 'title', post_date: 'December 2021', }, { post_title: 'title', post_date: 'November 2021', }, { post_title: 'title', post_date: 'October 2021', }, { post_title: 'title', post_date: 'September 2021', }, { post_title: 'title', post_date: 'August 2021', }, { post_title: 'title', post_date: 'July 2021', }, { post_title: 'title', post_date: 'June 2021', },];

const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December',]; 

const result = arr.map((o) => {
  const [month, year] = o.post_date.split(' ');

  return {
    ...o,
    unix_timestamp: new Date(year, months.indexOf(month)).valueOf() / 1000,
  };
});

console.log(result);

Note: months are 0 indexed beginning with 0 for January to 11 for December



Answered By - pilchard
Answer Checked By - David Goodson (WPSolving Volunteer)