Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate an RFC 3339 timestamp similar to Google Tasks API?

I am in the process of building an app that syncs with Google Tasks. As part part of the syncing, I want to compare the local task and the API task, and see which one has been changed more recently.

Each task from Google's API contains an updated property, which looks like this:

2011-08-30T13:22:53.108Z

Now I would like to generate a timestamp similar to that, so that every time I update a task on my app it sets a new updated value. To generate the RFC 3339 timestamp I am using - http://cbas.pandion.im/2009/10/generating-rfc-3339-timestamps-in.html which generates something like this:

2011-08-30T09:30:16.768-04:00

The issue is, the API date is always coming back as "greater" than the local date, even when the local date is newer. I'm guessing it has something to do with the different formatting between the two.

Here are two dates, the top is from the Google Tasks API (from about 10 minutes ago), and the bottom one was generated locally a minute ago. When compared which is greater, it's telling me the top one is.

2011-08-30T13:22:53.108Z
2011-08-30T09:41:00.735-04:00

Is my formatting wrong? What I am doing wrong here? Any help on this is really appreciated.

like image 666
levi Avatar asked Aug 30 '11 13:08

levi


3 Answers

It seems like a lot of complicated answers have been given, but this works just fine, does it not?

new Date().toISOString()
like image 129
Trenton D. Adams Avatar answered Oct 22 '22 12:10

Trenton D. Adams


The formatting is ISO so new Date().toISOString() will give you that form. Which as I'm reading might need to be shimmed:

/* use a function for the exact format desired... */
function ISODateString(d){
 function pad(n){return n<10 ? '0'+n : n}
 return d.getUTCFullYear()+'-'
      + pad(d.getUTCMonth()+1)+'-'
      + pad(d.getUTCDate())+'T'
      + pad(d.getUTCHours())+':'
      + pad(d.getUTCMinutes())+':'
      + pad(d.getUTCSeconds())+'Z'}

var d = new Date();
print(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z

Source: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

like image 51
Joe Avatar answered Oct 22 '22 12:10

Joe


I've found the moment.js library nice for working with time in javascript. moment().format() yields a timestamp in the format expected by the Google API for a datetime. Or, to not depend on the default format being correct for your application,

moment().format("YYYY-MM-DDTHH:mm:ssZ")

All the string options (including fractional seconds if that's what you need): http://momentjs.com/docs/#/displaying/format/

like image 12
Donny Winston Avatar answered Oct 22 '22 11:10

Donny Winston