103

I am setting a cookie with JavaScript and it is working fine but it is not taking the expire time I am giving. It keeps on taking session value regardless of what I give, below is the code which I took from here

var now = new Date();
var time = now.getTime();
var expireTime = time + 1000*60;
now.setTime(expireTime);
var tempExp = 'Wed, 31 Oct 2012 08:50:17 GMT';
document.cookie = aaa+'='+sStr+';expires='+now.toGMTString()+';path=/';

I tried giving hard-coded value but still it is showing expire as session in chrome dev tool

var tempExp = 'Wed, 31 Oct 2012 08:50:17 GMT';
document.cookie = aaa+'='+sStr+';expires='+tempExp+';path=/';

Any idea what I am doing wrong?

isherwood
  • 58,414
  • 16
  • 114
  • 157
antnewbee
  • 1,779
  • 4
  • 25
  • 38
  • how are you checking the time of expiration of your cookie? – polin Oct 31 '12 at 09:52
  • polin: in chrome press F12 (alternatively go to tools-> developer tools). It will open the frame below, there you can check. – antnewbee Oct 31 '12 at 10:02
  • I know how it comes. My question is can you see the expiration time. I've tried console.log(document.cookie) but there you can see the cookie not the expiration time – polin Oct 31 '12 at 10:11
  • Yes in 'Expires' column(after path column) it shows the date and time when the cookie will expire. But in my case it shows 'session' which means it will expire when I close the browser – antnewbee Oct 31 '12 at 11:02

9 Answers9

89

I've set the time to 1000*36000.

function display() { 
  var now = new Date();
  var time = now.getTime();
  var expireTime = time + 1000*36000;
  now.setTime(expireTime);
  document.cookie = 'cookie=ok;expires='+now.toUTCString()+';path=/';
  //console.log(document.cookie);  // 'Wed, 31 Oct 2012 08:50:17 UTC'
}

expiration

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
polin
  • 2,745
  • 2
  • 15
  • 20
  • 8
    A little explanation would be nice, what does the code actually do and what does "1000*360000" mean here? – Esko Jan 20 '21 at 10:59
  • While testing in localhost Firefox rejected the expire date because SameSite is not set and thus defaults to none. Setting document.cookie = `${YOUR_COOKIE_OR_WHATEVER};${THE_EXPIRE_TIME_OR_WHATEVER};SameSite=lax` seams to resolve the issue. – Hank W Dec 08 '21 at 17:40
68

Below are code snippets to create and delete a cookie. The cookie is set for 1 day.

// 1 Day = 24 Hrs = 24*60*60 = 86400.
  1. By using max-age:

    • Creating the cookie:
    document.cookie = "cookieName=cookieValue; max-age=86400; path=/;";
    
    • Deleting the cookie:
    document.cookie = "cookieName=; max-age=- (any digit); path=/;";
    
  2. By using expires:

    • Syntax for creating the cookie for one day:
    var expires = (new Date(Date.now()+ 86400*1000)).toUTCString();
    document.cookie = "cookieName=cookieValue; expires=" + expires + ";path=/;"
    
JSchirrmacher
  • 3,243
  • 2
  • 19
  • 27
user8640104
  • 1,018
  • 9
  • 7
29

Here's a function I wrote another application. Feel free to reuse:

function writeCookie (key, value, days) {
    var date = new Date();

    // Default at 365 days.
    days = days || 365;

    // Get unix milliseconds at current time plus number of days
    date.setTime(+ date + (days * 86400000)); //24 * 60 * 60 * 1000

    window.document.cookie = key + "=" + value + "; expires=" + date.toGMTString() + "; path=/";

    return value;
};
Johnny Leung
  • 564
  • 4
  • 7
  • 1
    What does `+ date + (days * 86400000)` do? – Asim K T Jul 24 '17 at 12:02
  • 4
    `+` before a variable just returns the numerical value of an object. In this case, `+date` is equivalent to `d.valueOf()`, which also happens to be the value returned by `date.getTime()`. – Shaun Cockerill Feb 01 '18 at 02:20
18
document.cookie = "cookie_name=cookie_value; max-age=31536000; path=/";

Will set the value for a year.

Toothbrush
  • 2,080
  • 24
  • 33
Bhupsa
  • 181
  • 1
  • 3
5

I use a function to store cookies with a custom expire time in days:

// use it like: writeCookie("mycookie", "1", 30)
// this will set a cookie for 30 days since now
function writeCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}
4

Use like this (source):

function setCookie(c_name,value,exdays)
{

var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie = c_name+"="+c_value+"; path=/";
}
Bulat
  • 720
  • 7
  • 15
Mark Zer
  • 51
  • 2
3

I'd like to second Polin's answer and just add one thing in case you are still stuck. This code certainly does work to set a specific cookie expiration time. One issue you may be having is that if you are using Chrome and accessing your page via "http://localhost..." or "file://", Chrome will not store cookies. The easy fix for this is to use a simple http server (like node's http-server if you haven't already) and navigate to your page explicitly as "http://127.0.0.1" in which case Chrome WILL store cookies for local development. This had me hung up for a bit as, if you don't do this, your expires key will simply have the value of "session" when you investigate it in the console or in Dev Tools.

pmccaffrey6
  • 31
  • 1
  • 2
1

Your browser may be configured to accept only session cookies; if this is your case, any expiry time is transformed into session by your browser, you can change this setting of your browser or try another browser without such a configuration

Community
  • 1
  • 1
0

Remember that some browsers as Safari, will not allow you to set a cookie expiration bigger than 1 week. This is due to Safari's ITP: https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/

Basically, this will block the expiration time if you create/modify a cookie through document.cookie property. Only cookies created/modified on the server side will be able to have a bigger expiration time.

Other browsers could do the same thing in incognito mode, even with a shorter expiration time, only for the session.