Tim Lake (Domhnall Gleeson) grows up in Cornwall, in a house by the sea with his father James (Bill Nighy), mother Mary (Lindsay Duncan), absent-minded uncle Desmond (Richard Cordery), and free-spirited sister Katherine or “Kit Kat” (Lydia Wilson). At the age of 21, Tim learns from his father that the men of his family have the secret ability to travel back in time, to moments they have lived before. In order to time travel, they must be in a dark space, clench their fists and visualize the memory they wish to travel back to. James discourages his son from using his gift to acquire money or fame, and Tim decides he will use it to improve his love life.
The following summer, Kit Kat’s friend Charlotte (Margot Robbie) visits. Tim is instantly smitten, but waits until the end of her stay to tell her how he feels; she tells him that he should have told her earlier. Tim travels back in time to tell Charlotte in the middle of the holiday, but she says it would be better to wait until her last day. Heartbroken, Tim realizes she is uninterested in him, and that time travel cannot change anyone’s mind.
Tim moves to London to pursue a career as a lawyer, living with his father’s acquaintance, Harry (Tom Hollander), an angry misanthropic playwright. Tim visits a Dans le Noir restaurant, where he meets Mary (Rachel McAdams). They flirt in the darkness, and afterward, Mary gives Tim her phone number. Tim returns home to find a distraught Harry, whose opening night of his new play has been ruined by an actor forgetting his lines. Tim goes back in time to put things right, and the play is a triumph.
However, later, when Tim tries to call Mary, he discovers that by going back in time to help Harry, the evening with Mary never occurred. He recalls Mary’s obsession with Kate Moss, and, through sheer persistence, finds Mary a week later at a Kate Moss exhibition. Unfortunately, he discovers that she now has a boyfriend. Tim finds out when and where they met (at a party). He turns up early, before the potential boyfriend arrives, and persuades Mary to leave with him instead. Their relationship develops, and Tim moves in with Mary. One night, he encounters Charlotte who now seems interested in him, but Tim turns her down, realizing that he is in love with Mary. He proposes; they marry and, fairly soon, have a daughter they name Posy.
Kit Kat’s difficulties in life and her drinking lead her to crash her car on Posy’s first birthday. As Kit Kat recovers, Tim decides to intervene in her life: he prevents the crash and takes Kit Kat back in time to avert her unhappy relationship with Jimmy (Tom Hughes). They manage to return to the present, where Tim finds Posy has never been born and he has a son instead. James explains that they cannot change events prior to their children’s birth and ensure that exact child will still be conceived. Tim accepts that he cannot change his sister’s life by changing her past; he allows the crash to occur, ensuring Posy’s birth, and he and Mary help Kit Kat improve her own life. She settles down with Tim’s friend Jay and has a child of her own. Tim and Mary have another child, a baby boy.
Tim learns his father has terminal cancer that time travel cannot change. His father has known for some time, but kept traveling back in time to effectively extend his life and spend more time with his family. He tells Tim to live each day twice in order to be truly happy: first, with all the everyday tensions and worries, but the second time noticing how sweet the world can be. Tim follows this advice; his father dies, but Tim travels to the past to visit whenever he misses him.
Mary tells Tim she wants a third child. He is reluctant because it means he will not be able to visit his father again. Tim tells his father that he cannot visit any more, and together they travel back to relive a fond memory from Tim’s early childhood. Mary gives birth to a baby girl, and Tim knows he can never see his father again. Tim comes to realize that it is better to live each day once, and appreciate life with his family as if he is living it for the second time.