Tim Lake (Domhnall Gleeson) starts to describe himself and his family. He was always “too tall, too pale, and too ginger.” His mother (Lindsay Duncan) was usually unsenintimental. His father James (Bill Nighy) was a former university professor who now enjoys his free time reading and playing table tennis,. His uncle Desmond (Richard Corderey) was a bit odd and presumably has Alzheimer’s, and his sister Katherine, nicknamed Kit Kat (Lydia Wilson), was free-spirited. The family has spent many joyful occasions together on the beach and at home, as Tim recalls.

Tim’s parents host a New Year’s Eve party, which Tim is none too fond of attending. He and his friend Jay (Will Merrick) clumsily stumble into a table which spills drinks and bottles everywhere, even onto some guests. Kit Kat hooks up with a guy named Jimmy Kincade (Tom Hughes), while a pretty young blonde woman show interest in Tim. When everybody counts down to midnight, the woman leans in to kiss Tim, but he instead shakes her hand and wishes her a happy new year. The woman is visibly disappointed while everybody else is kissing their significant others.

The next morning, Tim meets with his father in the family’s den. James informs him of a big family secret that his own father shared with him when he turned 21. Apparently, the men in the family have the ability to travel through time. Tim is dumbfounded and doubts what his father just told him, but he asks how this task is accomplished. James tells him to go into a dark place, close his eyes, clench his fists tight, and think of the exact moment he wants to go to, and he will find himself there. Of course, he adds, there are limits to his time traveling, as he can only go to moments in his own life, as he cannot “kill Hitler or shag Helen of Troy.”

Tim goes into the wardrobe in his bedroom to make this attempt. He does what James told him, and he suddenly hears the Killers song “Mr. Brightside” playing loudly and he is stunned to see he is wearing the same outfit he wore at the New Year’s Eve party. He avoids bumping into the table and when the countdown to midnight happens, he grabs the blonde woman and kisses her, much to her satisfaction. Tim returns to the present to express his astonishment to his father. He asks Tim what he plans on using this ability for and he answers that he’d really like to use it to get a girlfriend.

Summertime rolls around and Kit Kat’s friend Charlotte (Margot Robbie) arrives to stay with the family, and Tim is instantly smitten with her. While she and Kit Kat are sunbathing, Charlotte asks Tim to rub sunscreen on her back. He jumps with excitement at the request and as he tries to squeeze the tube, he squirts a big load of sunscreen on Charlotte’s back. Tim awkwardly runs away into the house and into the closet to go back to this moment. He now acts more laid back and suave, then gently applies sunscreen to Charlotte’s back.

On the eve of Charlotte’s last day with the family, Tim goes into her room to ask her a question. Before he says anything, she says he had better not ask any question about love, as Kit Kat said he may have, but that’s exactly what he was going to ask. Although Charlotte finds him sweet, she tells him he shouldn’t have waited ’til her last night to make a move and that he should’ve tried earlier. This leads him to walk into the closet next to her room and go back a month, midway through her stay, to make a move. Charlotte is more interested, but then says they should wait until her last night to see how she feels. Tim eventually realizes that no matter how much he travels back in time, he cannot make Charlotte fall in love with him, and so she leaves him with a broken heart.

After the summer, Tim moves to London to pursue his career as a lawyer. He moves in with a family friend named Harry Chapman (Tom Hollander), a grouchy playwright. He then starts work at a law firm and makes friends with a young man named Rory (Joshua McGuire), who spends a lot of time close to Tim as he continues his search for a girlfriend.

One evening, Jay takes Tim to a restaurant where they are paired up with blind dates in a dark room. Tim spends the night talking to a girl named Mary (Rachel McAdams) while Jay is with her friend Joanna (Vanessa Kirby). Tim and Mary hit it off while Joanna hardly shows interest in Jay. The guys meet the girls outside and Tim is enchanted by Mary’s beauty, even though she doesn’t see herself as being particularly attractive. Tim says he admires her dress and her fringe hairstyle. Before she and Joanna leave, Tim manages to get Mary’s number.

Tim returns home to find Harry bitter over a failed performance at his play where one of his actors forgot his lines onstage. This inspires Tim to start the night over so he can join Harry at the play to change his mood. Tim goes to the dressing room of one of the main actors (Richard Griffiths – his last onscreen appearance) to encourage him to give his script another look over. The actor rudely tells Tim off, but then does read through his script. Tim and Harry watch the play and the actor delivers his lines spot on, to which the audience applauds. Unfortunately, as it turns out, it is another actor (Richard E. Grant) who completely freezes onstage. Tim leaves to go back in time and go backstage to hold up cards for the actor to look to, which allows him to recite his lines perfectly and also receive applause. After the show, Tim goes to call Mary, only to see her number isn’t listed in his phone. He rushes to the restaurant where they met and is told by the host that Mary and Joanna had already left, and since they payed in cash, he can’t give Tim anymore information.

Harry reads the paper the next morning to find a glowing review for his play, though what catches Tim’s eye is an ad featuring Kate Moss, since he and Mary chatted about her when they first met. This leads him to go to a museum featuring an exhibit with Kate Moss pictures, hoping to find Mary there. He goes for days upon days with no luck until Kit Kat comes by to help him out. Finally, Mary strolls by, and Tim seizes the opportunity to talk to her. He tells her it’s good to see her, but she tells him that they’ve never met. He says he knows her name is Mary, but it only makes her a bit uncomfortable. He leaves rather embarrassed, but Kit Kat convinces him to go back, just as Joanna arrives. Tim convinces Mary to let him tag along as long as he assures her he’s not a lunatic or an odd fringe fetishist. He joins them for lunch and learns that Mary has a boyfriend. Said boyfriend, Rupert (Harry Hadden-Paton), arrives to join the girls. Tim starts asking pressing questions about how they met and where, which happens to be at a party Joanna threw the previous week at her flat. She even gives Tim the specific address to the place, which is enough information for Tim to run into the bathroom to time travel again.

Tim runs to Joanna’s party in time to find Mary sitting by herself near the window. He starts to chat her up, first coming off as awkward, but then convinces her to leave the party so they can have dinner together, thus allowing Mary to never meet Rupert. On their date, Tim learns that Mary works for a book publisher, and they have another chat about Kate Moss. After dinner, Tim walks Mary home and they kiss for the first time. She invites him inside for sex, which doesn’t go smoothly the first time. Tim goes back in time to try again, which turns out better, but he tries once more, being more assertive and leaving both himself and Mary very satisfied.

Tim and Mary officially start dating, going through many months together through the train station as a musical group plays a romantic song through their montage of love. One day, Mary’s parents come to visit from America, though she springs it on Tim at the last minute just as they’re coming up to their apartment. She warns him that her parents are very conservative and to not mention their intimacy. They arrive at the door and Tim foolishly blurts out that they do not have oral sex. Naturally, he goes back in time to undo this and he has a meal with Mary and her parents, leading Mary to say that she loves Tim.

One evening, Tim and Rory go to watch a play, and Tim notices Charlotte there with her friend Tina (Catherine Steadman). After the play, Tim goes to say hi to Charlotte, and she introduces Tina as her girlfriend. This gives Tim the wrong idea that she rejected him because he believes she was a lesbian, though she says that’s not the kind of girlfriend she meant. He goes back to undo this, though he still makes a blundered remark about misusing “girlfriend” to make someone think she’s gay, when it turns out that Tina really is gay. Tim goes back in time, but instead doesn’t approach Charlotte. However, Charlotte happens to spot him as he is leaving with Rory. She chats him up and then goes to have dinner with Tina, only to come back moments later to invite Tim to join her while she ditches Tina. The two have dinner and then go back to her place. Charlotte begins to invite him in, but Tim sees where this is going and he tells her there is something he needs to do.

Tim runs back to his apartment to find Mary sleeping. He wakes her up to propose to her, though she is too tired and half-asleep to respond. He time travels to play music and approach her more gently to ask her to marry him. She says yes and thanks him for not doing a grand public proposal.

Tim and Mary visit Tim’s family to give them the news. He finds Kit Kat, who tells him she’s been let go from another job. She runs into the living room to tackle Mary and kiss her cheek repeatedly. Over dinner, Tim announces to the family that he and Mary are going to get married, and they are planning on doing it soon as they are also going to have a baby. The family is overjoyed to hear this news. That evening, Tim and Mary start making plans, such as using the song “Il Mondo” at the wedding, where they’ll get married, who Tim’s best man will be, and where they will spend their honeymoon.

The day of the wedding arrives. Even though it starts pouring rain, everything turns out fun and enjoyable for the couple. During the reception, where Rory is the best man, he starts to give an awkward speech, leading Tim to time travel and pick Harry as his best man. Harry starts making rude comments toward Tim, which makes him go back to pick Jay. This is just as bad since Jay starts making crude sexual references, forcing Tim to just pick his dad as the final best man. James ends up giving a half-assed speech, so he decides to time travel himself to give a much nicer speech in which he states he’s only loved three men – Uncle Desmond, BB King, and Tim.

Not long after, Mary gives birth to her and Tim’s first child, a girl they name Posy. They eventually move into a house of their own, even though Tim states they can hardly afford it, but he and Mary are happy nonetheless. One year later on Posy’s first birthday, Tim’s family arrives but they are still expecting Kit Kat. There is a knock at the door, but it turns out to be Jimmy Kincade. Tim asks about Kit Kat and Jimmy says that he got into a fight with her and she had been drinking earlier. Tim and Mary rush to the hospital to find out that Kit Kat was in a car accident due to her driving drunk. Tim time travels to bring Kit Kat to his house before she drives anywhere. He takes her for a walk on the beach to confront her over her problems with Jimmy. He then admits his secret to her and brings Kit Kat into a closet to time travel back to the New Year’s Eve party where she met Jimmy. She is just as surprised to find herself in her old clothes as Tim was at the beginning. Tim holds Kit Kat away from walking to Jimmy, and they see him approach another girl. Kit Kat realizes what a jerk Jimmy is, and she goes over to him to punch him square in the face.

Tim takes Kit Kat back to the present and her memory has been altered, so she tells Tim that she is now with Jay. Tim is pleased to see that Kit Kat is happier with Jay, and he goes back home. When he goes to play with Posy, he is shocked to see that his daughter is now a boy. He time travels to the day of the child’s birth to meet his father. He tells his son that because the child was born in between the time-traveling Tim did with Kit Kat, he altered the timeline so that he instead had a son. Tim realizes he must undo Kit Kat’s new timeline so that Posy is born. Kit Kat still suffers the car accident, but Tim and Mary stay by her bedside until she vows to break up with Jimmy and maintain her job. Before he leaves, Tim tells Kit Kat that Jay has always had a crush on her and that she should talk to him.

Sure enough, Posy is still born, and Tim plays with his daughter. He tells Mary he wants another child, though Mary doesn’t want to go through the process again. Despite this, they have another baby, this time a boy named Jeff.

One evening, Tim and Mary are going out to have dinner with Mary’s publisher. She goes through a bunch of dress changes because she is unsatisfied with how she looks despite Tim telling her she looks lovely in anything. Mary eventually goes back to the very first dress she tried on. She asks Tim where Posy is, and he tells her he left her downstairs. Unfortunately, he left her with the publisher’s manuscript, which Posy colored over in crayon and put through the paper shredder. Mary is furious, and as Tim tries to walk out so he can undo this via time travel, Mary does not let him leave. The phone then rings and she answers angrily, then apologizes when she finds out it’s Tim’s mother. She passes the phone to him and Tim’s face becomes worried when he speaks to his mother.

Tim and Mary go with Kit Kat back to the family’s home. Kit Kat runs inside tearfully while Tim asks his mother how she is. She responds “I am absolutely uninterested in a life without your father.” Desmond tells Tim that James has cancer. He adds that on Tim’s wedding day when James told Desmond he loved him that it was the happiest day of his life, and now learning of this news makes this the worst day. Tim meets with his dad and learns that he has merely weeks left. He admits that he’s been time-traveling a lot to give himself more time to spend with his family and to read a lot of books. He then tells Tim he has another secret to tell him.

Tim narrates that his father gave him a two-part plan to enjoy his life. The first part is to go through a day normally as it plays out – we see Tim going to work, watching Rory get chastised by their boss, going to get lunch, and going to a case with Rory that turns out to be successful, living the day with the stresses he ought to face. The second part is to go back in time and relive the day while embracing it for what it is. He relives that day with a more upbeat feel, even allowing Rory to enjoy the day.

The day comes for James’s funeral. While everybody is getting ready, Tim time travels to a moment with his father, letting him know that he is arriving from the funeral. He sits down with James to listen to him read a passage from a Charles Dickens novel.

Mary tells Tim that she wants a third child, this one being the “insurance baby” – as she explains, in case one of their children ends up being smart and the other doesn’t, there can be “two happy dummies” instead of one miserable one. Tim is on board with the idea, though he realizes that this means he would have to permanently let his father go. Over the following nine months as Mary is pregnant with their third child, Tim visits his father. On the ninth month, as Mary is nearly ready to deliver, Tim visits his father one last time. They play table tennis, and James asks what his reward should be. Tim says he will give him a kiss, and from the look on his face, James is able to determine what this means. Tim goes over to give his father a kiss, and then the two go into a dark place to time travel together to a day when Tim was a child. He and his father spend the day together at the beach.

Tim and Mary’s third child is born, a girl named Jo. Kit Kat and Jay have also gotten married and had a child of their own. By this time, Tim has decided that he may now live his life without time travel, as it is perfect the way it is. He kisses Mary as she lays in bed while he goes to take his children, now slightly older, off to school.

The film ends with a brief montage with most of the other characters (Rory, Harry, Tim’s mother, Kit Kat, Joanna, etc.) enjoying their lives one day at a time.