英语语法

过去完成时 vs 一般过去时:什么时候真的需要 had

大多数学习者要么从不用过去完成时,要么到处乱撒。真正需要它的那一种情况、三种可有可无的情况,以及为什么 "had had" 是正确英语。

FlexiLingo 团队
2026年8月28日
15 分钟阅读
在这里练

在真实视频里看一遍

FlexiLingo 视频库的每个视频都有可点击字幕和完整文稿。点任意单词即可查看释义、听发音,并留作复习。

打开视频库

1过去完成时是一个倒带键

所有解释都称它为「过去的过去」,说得没错,也毫无用处,因为这并没告诉你什么时候需要它。下面这个画面更好用。

过去完成时是一个倒带键。你正用一般过去时讲故事,一路往前。当你需要**往回跳**到更早的事情时,你按下 had。回到主线时,你松开它。

"I got to the station at nine. The train had left at eight." 故事停在九点。火车的离开早于那个点,所以它拿 had。注意两件事都已结束、都在过去,而一般过去时本来也完全清楚。had 添加的是**顺序**。

所以过去完成时在自然句子里从不单独出现。它需要一个过去的参照点,好让自己早于它。"I had eaten breakfast" 单独说会显得没说完,因为听者还在等着听「早于什么」。

把这两句的顺序理清楚:(a) When I arrived, the meeting started. (b) When I arrived, the meeting had started.

(a) 我到了,然后会议开始——我准时。(b) 会议先开始了,我迟到进场。差别只有一个词,而它决定了你守不守时。

Tip: 如果你能给较早的那件事加上 "already" 或 "first" 而意思不变,那么过去完成时在那里就在做实事。

2唯一真正需要它的时候

学习者通常被教一张用法清单。实际上只有一种情况,省掉过去完成时会真的改变意思,其余都是可有可无的润色。

当事件顺序无法从句子本身看出、而弄错会误导听者时,你**才真正需要**过去完成时。

比较 "When I got home, my brother cooked dinner" 和 "When I got home, my brother had cooked dinner"。前者说他在我到家之后才开始做。后者说晚饭已经做好等着了。同样的词,不同的一晚。这里过去完成时不是修辞,它承载信息。

  • When the police arrived, the thief escaped. — the escape happened after they arrived
  • When the police arrived, the thief had escaped. — he was already gone
  • She told me she was married. — she is married now
  • She told me she had been married. — she was married before, and is not now
  • I didn't recognise him because he changed. — he changed at that moment (odd)
  • I didn't recognise him because he had changed. — he had changed before I saw him

注意这些对子无关优雅。每一组里,去掉 had 都会产生一个语法正确、听起来自然、但说的不是你本意的句子。这一类才值得学。

Tip: 问自己:如果这里用一般过去时,听者会不会把顺序搞反?会,就需要 had。不会,那多半不需要。

3三种可有可无的情况(通常省略)

这是教科书跳过的那一半,也是学习者觉得过去完成时难以捉摸的原因。很多时候它正确但多余,母语者会省掉。

1. 当 after 或 before 已经指明了顺序

"After I finished work, I went home" 是大多数人会说的。"After I had finished work, I went home" 也对,但 after 已经告诉你哪件在先,had 就没活可干了。口语中简单版几乎每次都赢。

2. 当事件按发生顺序列出时

"He opened the door, took off his coat and sat down." 这里没人用过去完成时,因为句子顺序已经映照了时间顺序。过去完成时是留给这两个顺序不一致的时候。

3. 当顺序凭常识就很明显时

"I was tired because I didn't sleep well." 严格说 hadn't slept 更精确,但没有听者会误解,所以简单形式很正常。对比前面 "he had changed" 的例子,那里意思确实会变。

经验法则:如果 after、before、then、first 或者常识已经把顺序钉死了,过去完成时就是可选的——而且省掉它通常更自然。

Tip: 这正是你从母语者那里听到的过去完成时比教科书暗示的要少的原因。他们不是马虎,而是省掉了一个不携带信息的标记。

4怎么构成,包括 "had had"

形式简单得令人愉快:一个助动词、一个分词,没有任何需要操心的一致关系。

had + 过去分词,所有人称完全相同:I had gone、she had gone、they had gone。不像现在完成时那样有 has/have 之分,这让它成为最容易构成的完成时。缩写是 'd——I'd finished、she'd left——否定是 hadn't。

分词是动词第三形式,和现在完成时用的是同一个:go/went/gone、write/wrote/written、see/saw/seen、take/took/taken。如果你已经为现在完成时练过分词,这个时态所需的词汇功课就已经全做完了。

"I had had" 是对的,不是打错字

当主动词是 have 时,had 会出现两次:助动词加分词。"By the time we met, I had had three jobs that year." 看着像错的,其实不是。别处也一样:现在完成时的 "I have had",甚至 "had had had" 在构造出来的例句里也成立,只是没人这么说。

听的时候要留心 'd 缩写:"I'd finished" 是 had,"I'd finish" 是 would。分词会告诉你是哪一个。这在听力上绊倒学习者的次数远多于写作。

Tip: 因为 had 对所有人称都一样,过去完成时往往是学习者第一个能在语速下准确产出的时态。难的是知道**何时**用,而不是**怎么**用。

5before、after 和 by the time

这三个连词经常和过去完成时一起出现,而每一个的表现都略有不同。

before——过去完成时放在**主句**

"I had finished the report before she arrived." 这里 before 标记的是较晚的事,所以较早的那件拿 had。你也可以说 "I finished the report before she arrived",意思一样;before 已经把它们排好了。

after——过去完成时放在 after 从句

"After I had eaten, I went out." 由 after 引导的从句是较早的那件。同样,"After I ate, I went out" 一样正确,而且在口语中更常见。

by the time——这个是真的想要过去完成时

"By the time we arrived, the film had started." 三者之中,这是过去完成时听起来真正必要而非可选的一个,因为 by the time 明确指向一个期限,某事发生在它之前。

  • By the time I got there, everyone had left. — natural, past perfect expected
  • By the time I got there, everyone left. — sounds incomplete to a native ear
  • After I had spoken to her, I felt better. — correct, slightly formal
  • After I spoke to her, I felt better. — correct, more usual

Tip: 如果你想挑一个短语来练过去完成时,就用 by the time。这是它最可靠地配得上自己位置的语境。

6叙事规则:一个过去,然后退一步

故事才是这个时态真正生活的地方,而且有一个清晰的模式,多数学习者从没被人指出来过。

叙述用一般过去时推进。当你需要背景——发生在故事开始之前的事——你切到过去完成时写一两句,然后再切回来。过去完成时是岔路,不是主路。

"She walked into the office and sat down. She had spent the whole night preparing, and she had barely slept. Her manager looked up and smiled." 两句一般过去时,两句过去完成时作背景,然后切回。这个形状是这个时态在真实写作中最常见的用法。

别停在过去完成时里。一旦你确立了自己身处更早的时间框架,英语允许你在这段闪回内部落回一般过去时:"She had arrived at six, checked into the hotel and gone straight to bed." 只有第一个动词需要 had;每个动词都重复会显得沉重、不像母语者。

最后这一点解释了大量笨拙的学习者写作。理解了这个时态的人常常过度标记,把 had 放在闪回的每个动词上,而不是只放在开启闪回的那一个。

Tip: 带着这个念头去读几乎任何一本小说的第一页。你会看到一般过去时、一小块过去完成时的前情、然后又是一般过去时——通常就在前三段之内。

7过去完成进行时:某个过去时点之前的持续

进行式往这里加了一个意思:某事在你描述的那个过去时点之前**已经持续了多久**。

had been + -ing,同样对所有人称一样:I had been waiting、she had been working、they had been arguing。

"I had been waiting for an hour when she finally arrived." 等待正在进行、有持续时长,并在她到达那一刻停止。对比 "I had waited for an hour"——正确,但它把等待呈现为一个完成的整块,而不是一项进行中的活动。

它也带着其他完成进行时那种「证据」味道:"His eyes were red — he had been crying." 你在用导致某个可见状态的过程来解释它。

  • She was tired because she had been running. — the running explains the tiredness
  • She was tired because she had run five miles. — focus on the completed distance
  • They had been living there for ten years before they moved. — duration
  • They had lived there for ten years before they moved. — also correct, less vivid

状态动词不能用进行式,和其他任何时态一样:不能说 "I had been knowing him",也不能说 "she had been owning the car"。用简单过去完成时:I had known him、she had owned the car。

Tip: 如果 for two hours 或 since morning 这类时间表达与一个过去参照点同时出现,进行式通常是两者中更自然的那个。

8间接引语:它自动出现的地方

你这辈子会产出的过去完成时里,有很大一部分来自转述别人的话,而这里这个时态基本是机械的,不是判断题。

当你转述一个过去时的句子时,它会往后退一格。现在变过去,过去变过去完成。"I finished it" 转述后成为 "He said he had finished it"。这种后移在讲究的英语里是自动的。

  • "I lost my keys." → She said she had lost her keys.
  • "I have finished." → He told me he had finished.
  • "I saw him yesterday." → She said she had seen him the day before.
  • "I was living in Rome." → He said he had been living in Rome.

注意一般过去时和现在完成时在转述后会塌缩进同一个过去完成时。这正是过去完成时在书面报告里如此常见的原因:两种不同的原始时态一起漏斗进它。

在随意口语里后移常常被跳过:"She said she lost her keys" 极其常见,也没人反对。但在考试写作、正式报告和学术英语中要用——这是安全选择,而且永远不会被判错。

Tip: 如果你在准备雅思、CELPIP 或剑桥的写作,间接引语是过去完成时用最少力气帮你拿分的地方,因为规则是机械的。

9第三条件句与 "I wish I had"

两个固定结构使用过去完成时,而且都是关于**没有**发生的事。把它们当作句型来学,而不是从时态规则推导。

第三条件句——对过去的懊悔

If + 过去完成时,would have + 分词:"If I had studied, I would have passed." 两半都描述一个非真实的过去。考试最爱的错误是把 would 放进 if 从句:"If I would have studied" 在标准英语里是错的,尽管你会在随意的美式口语里听到。

I wish / if only + past perfect

"I wish I had said something." "If only we had left earlier." 这些表达对如今已无法改变之事的懊悔。注意这个对比:"I wish I had a car"(一般过去时)说的是现在——我现在没车。"I wish I had had a car"(过去完成时)说的是过去。

should have——同样的意思,更柔和

"I should have called her." "You shouldn't have said that." 这是英语表达过去懊悔的日常方式,而且在口语里比完整的第三条件句常见得多。

  • If I had known, I would have helped. — I didn't know, so I didn't help
  • If I knew, I would help. — second conditional, about now
  • I wish I had studied harder. — regret about the past
  • I wish I studied harder. — about my current habits

Tip: wish 这一对值得当作对比记住:一个 had 说的是现在,两个 had 说的是当时。

10没人警告你的滥用问题

学习者一旦理解了过去完成时,一个可预料的第二阶段就开始了:他们用得太多。这大概比用得太少还常见,而且更显眼。

闪回里的每个动词都拿 had。"She had arrived, had checked in and had gone to bed" 应该是 "She had arrived, checked in and gone to bed"。一个 had 打开闪回;其余的搭顺风车。

它出现在 after 或 before 已经干完活的地方。"After I had woken up, I had made coffee" 被标记了两次,读起来很沉。"After I woke up, I made coffee" 才是母语者写的。

它渗进了从未离开主时间线的简单叙述。如果你按发生顺序讲事情,就根本不需要它——而满篇 had 的段落标示的是学习者,不是流畅的写作者。

它被拿来代替现在完成时表示刚过去的事。刚做完就说 "I had finished my homework" 是错的;你要的是 "I have finished"。过去完成时需要一个过去参照点,而「刚刚」不是。

一个可靠的自查:段落里每出现一个 had,就去找它所早于的那个较晚的过去事件。如果指不出来,就把 had 删掉。

Tip: 听起来像母语者的写作用过去完成时非常克制——通常每页一两次,出现在故事往回退的那一块。如果你的每句都有,那就是要改的错。

11二十五个句子,逐句改正

把右边遮住,看答案之前先改每一句。有些需要加 had,有些需要去掉——后一半正是练习册从不考的。

  • When I arrived, the train already left → When I arrived, the train had already left
  • I had finished my homework just now → I have finished my homework just now
  • After I had eaten, I had gone out → After I ate, I went out
  • By the time we arrived, the film started → By the time we arrived, the film had started
  • She had arrived, had sat down and had ordered → She had arrived, sat down and ordered
  • If I would have known, I would have come → If I had known, I would have come
  • I wish I would study harder last year → I wish I had studied harder last year
  • He said he has finished the report → He said he had finished the report
  • I had been knowing him for years → I had known him for years
  • She was tired because she had ran → She was tired because she had been running
  • I had ate before I left → I had eaten before I left
  • When she called, I already had gone to bed → When she called, I had already gone to bed
  • I had have three cars in my life → I have had three cars in my life
  • Before I had left, I had locked the door → Before I left, I had locked the door
  • They had lived there since ten years → They had lived there for ten years
  • I didn't recognise him because he changed a lot → I didn't recognise him because he had changed a lot
  • The room was empty; everyone went home → The room was empty; everyone had gone home
  • I had went to the shop yesterday → I went to the shop yesterday
  • He had told me that he had been to Japan, so I asked him → He told me he had been to Japan, so I asked him
  • We had been waiting since two hours → We had been waiting for two hours
  • By the time I had finished, everyone had left → By the time I finished, everyone had left
  • She said she is married → She said she was married
  • If only I didn't say that → If only I hadn't said that
  • I had never seen snow until I moved here → correct as written
  • He had been dead when the ambulance arrived → He was dead when the ambulance arrived

Tip: 最后两句才有意思。第 24 句本来就对,而第 25 句表明:过去某一时刻的状态用一般过去时,不用过去完成时。

12在真实故事里发现它

这个时态在英语诸时态中很特别,它主要活在叙事里而不是对话里。这就决定了你该去哪儿找它。

在随意口语里你听到的过去完成时相对很少,而在任何讲故事的东西里都很多:有声书、真实犯罪播客、纪录片旁白、新闻特写、小说。想要富含这个时态的输入,就朝那边去。

听叙事还会教给你第六节描述的节奏——作者如何潜入过去完成时两句再爬出来。这个形状从孤立练习里非常难学,从故事里却非常容易吸收,因为你能感觉到那一步后退正在发生。

  • 挑一个有旁白的东西——真实犯罪播客或纪录片最合适
  • 每次听到 had 加分词就暂停,找出它所早于的那个较晚事件
  • 留意叙述者多快就回到一般过去时
  • 存整句,因为这个时态离开参照点就没有意义
  • 自己复述一段经过,had 只用一次

Tip: FlexiLingo 在播客和 YouTube 上叠加互动字幕,你可以点任意单词查看释义和 CEFR 等级,再连同整句一起收藏——这在这里很关键,因为脱离了周围句子的过去完成时什么都教不了你。

常见问题

我什么时候真的需要过去完成时?

当两个过去事件的顺序不明显、而弄错会造成误导时。"When I got home, my brother cooked dinner" 意思是他在我到家后才开始;"had cooked" 意思是饭已做好等着。如果一般过去时会让听者拿到错误的顺序,就用 had。如果 after、before 或常识已经把顺序定死,它就是可选的,而且通常省略。

"had had" 正确吗?

正确。当主动词是 have 时,你会得到助动词 had 加分词 had:"By the time we met, I had had three jobs that year." 它看着像错误,其实不是。现在完成时的 "I have had" 也有同样的重复。

过去完成时和现在完成时有什么区别?

现在完成时把过去连到**现在**:"I have finished" 表示到此刻为止已完成。过去完成时把一个过去点连到更早的一点:"I had finished" 表示在另一个过去事件之前就完成了。过去完成时永远需要第二个参照点,所以 "I had finished just now" 是错的——你要的是 "I have finished"。

我能直接用一般过去时吗?

通常可以——母语者也经常这么做。在 after、before、then、first 之后,或者顺序显而易见时,一般过去时自然,而过去完成时显得沉重。例外是去掉 had 会真的改变意思的时候,以及 by the time 之后,那里人们预期过去完成时。

为什么 "If I would have known" 是错的?

在标准英语里,第三条件句把过去完成时放在 if 从句、把 would have 放在主句:"If I had known, I would have come." would 不属于 if 那一半。你会在随意的美式口语中听到 "If I would have known",但它在任何考试和正式写作里都判错。

我懂规则,可我的文字读起来很沉。为什么?

几乎肯定是滥用。刚掌握这个时态的人往往把 had 加在闪回的每个动词上,而其实只有第一个需要:"She had arrived, checked in and gone to bed",不是 "had arrived, had checked in and had gone"。检查每一个 had,找出它所早于的那个较晚事件;找不到就删掉。

2026年8月28日
FL
FlexiLingo 团队
我们打造的工具,把真实内容——YouTube、播客、文章——变成带互动字幕、即时查词和间隔重复的语言课程。

从故事里学时态,而不是从表格里

FlexiLingo 视频库的每个视频都有可点击字幕和完整文稿。点任意单词即可查看释义、听发音,并留作复习。