你已经学过过去完成时(I had finished——两个过去事件中较早发生的那个)和现在完成进行时(I've been waiting——持续至今)。过去完成进行时把这两个概念结合起来:表示某个动作在过去某一时间点之前已经持续了一段时间。
- I*'d been waiting** for an hour when the bus finally came.*
- She was tired because she*'d been working** all night.*
- They*'d been living** in Rome for a year before they moved to Milan.*
构成是 had + been + 动词-ing。
快速公式:主语 + had + been + 动词 -ing → I'd been working. She hadn't been sleeping. Had you been waiting long?
如何构成
这三个部分的顺序固定,且 had 不随主语变化:
| 主语 | had | been | -ing 形式 |
|---|---|---|---|
| I / you / he / she / it / we / they | had | been | working、waiting、studying… |
- I had been studying for hours before the exam started. → I*'d been studying** for hours before the exam started.*
- He had been driving all day when the accident happened.
- We had been planning the trip for months.
因为 had 对所有主语都一样,这里不像过去进行时那样有 was / were 的区分。-ing 形式遵循常规拼写规则(去掉词尾不发音的 -e:make → making;以重读闭音节结尾时,双写词尾辅音字母:run → running)——与过去进行时的规则完全相同。
核心用法:某一过去时间点之前的持续时长
这是 B2 阶段的核心用法——表示某件事在另一个过去时间点之前已经持续了多久:
- By 6 p.m., we*'d been travelling** for ten hours.*
- How long had they been dating before they got married?
- She*'d been feeling** ill for a few days before she saw a doctor.*
同样使用 for(时间段)或 since(起始点),与现在完成进行时一样,只不过这里的参照点是过去的某一时刻,而不是现在:
- He*'d been working** there for five years when the company closed.*
- They had been waiting since dawn when the gates finally opened.
汉语常用“已经……了”加上具体时长来表示某个动作在过去某一时刻之前已经持续了多久,比如“大门终于打开时,他们已经等了好几个小时了”。汉语没有与过去完成进行时完全对应的语法形式;英语的 had been + -ing 额外强调动作在那个过去时间点之前一直持续,而不只是曾经发生过。
用近期原因解释过去的状态
正如现在完成进行时用来解释现在的状态,过去完成进行时用来解释过去的状态——某个动作不久前一直在发生,无论它是刚刚结束还是仍在继续,它造成的影响在那个过去时刻是看得见的:
- Her clothes were wet because she*'d been swimming**.*
- He was out of breath — he*'d been running**.*
- The kitchen was a mess. Someone had been cooking.
这就像站在过去的某个时间点,回头看是什么原因导致了眼前的状况——和 I've been working, that's why I'm tired 的逻辑一样,只是把时间往前推了一步。
过去完成进行时与过去完成时的对比
两者都是从过去某一时间点往回看,侧重点的差异类似于现在完成时和现在完成进行时之间的差异:
| 过去完成时 | 过去完成进行时 | |
|---|---|---|
| 侧重点 | 结果、数量或已完成的事件 | 进行中的动作或其持续时间 |
| 示例 | She had written three emails before lunch.(三封——数量重要) | She*'d been writing** emails all morning.*(持续的动作重要) |
| 示例 | He had finished the report when I called.(已经完成) | He*'d been writing** the report when I called.*(可能还没完成) |
简单的判断方法:如果强调结果、数量或已经完成的事件,就用过去完成时;如果强调持续时间或动作的进行状态,就用过去完成进行时:
- ✅ I*'d read** four chapters by the time she arrived.*(读完的章节数 = 结果)
- ✅ I*'d been reading** for an hour by the time she arrived.*(读了多久 = 持续时间)
过去完成时也常用于表示持续时间——当整个时间段被当作一个已完成的事实来陈述时,尤其是像 live、work、study 或 teach 这类可表示长期情况的动词:I had worked there for five years before I left. 过去完成进行时则更强调动作的持续性或进行状态:I'd been working there for five years and still didn't feel settled.
有些动词两种形式都自然,含义略有不同:I'd lived there for years(过去完成时——常见于长期情况)与 I'd been living there for years(过去完成进行时——略强调持续进行)。两者均正确。
过去完成进行时与过去进行时的对比
这两种时态回答的是不同的问题。过去进行时描述的是过去某一具体时刻正在发生的事;过去完成进行时描述的是一直持续到过去某个较晚时刻的动作:
- At 8 p.m., I was cooking dinner.(正是那一刻——过去进行时)
- By the time she arrived, I*'d been cooking** for an hour.*(在那个较晚时刻之前已持续的时间——过去完成进行时)
状态动词通常仍用简单形式
描述状态而非动作的动词——know、believe、understand、like、love、need、own、have(表示拥有)——即使在过去时态里,表达持续时间时通常也仍用简单形式:
- ❌ I'd been knowing him for years before I found out. → ✅ I'd known him for years before I found out.
- ❌ She'd been having the car since 2018.(表示拥有)→ ✅ She'd had the car since 2018.
和往常一样,这些动词中有些在表示临时性或动作性含义时可以用进行式(He'd been having second thoughts),但以其核心状态含义使用时不行。
否定形式
not 放在 had 和 been 之间——通常缩写为 hadn't:
- I hadn't been sleeping well before the trip.
- They hadn't been speaking for months when they finally made up.
疑问句
在疑问句中,had 移到主语前面:
- Had you been waiting long?
- Had she been feeling unwell before the appointment?
- How long had they been living there?
简短回答:Yes, I had. / No, I hadn't.
常见错误
- ❌ I had been wait for an hour. → ✅ I had been waiting for an hour.(been 后面要接 -ing 形式)
- ❌ She had been been working all day. → ✅ She had been working all day.(只能有一个 been)
- ❌ How long you had been waiting? → ✅ How long had you been waiting?(疑问句中 had 要移到主语前面)
- ❌ We had been living there since three years. → ✅ We had been living there for three years.(three years 是时间段,要用 for)
- ❌ I'd been knowing her since school. → ✅ I'd known her since school.(状态动词 → 过去完成时简单形式)
- ❌ He had been finished the report when I arrived.(混用了两种形式)→ ✅ He had finished the report when I arrived.(结果 → 简单形式)或 He*'d been writing** the report when I arrived.*(进行中 → 进行式)——但不能两者同时使用。
自我检测
应该用过去完成时,还是过去完成进行时?
- By the time the ambulance arrived, he ____ (lie) on the ground for ten minutes.
- She ____ (write) three chapters before her laptop broke.
- ____ you ____ (wait) long when the taxi finally showed up?
- They were exhausted because they ____ (hike) since sunrise.
- I ____ (know) him for years before he told me his real name.
查看答案
- had been lying(在救护车到达前已经持续了十分钟)
- had written(章节数量 = 结果)
- Had you been waiting(出租车到来之前持续的时间)
- had been hiking(持续的动作解释了疲惫)
- had known(状态动词 → 简单形式,即使表达持续时间也是如此)
用 GrammarMama 学得更快
这篇文章只讲了一个知识点——来看看 GrammarMama 如何帮你把它变成持久的进步:
-
了解你的水平 — 快速定级测试帮你确定 CEFR 等级,让每道练习都适合你。 测试我的水平 →
-
沿着清晰的路径学习 — 按照正确的顺序练习每个主题,从 A1 一直到 C2。 查看完整路径 →
-
设定你自己的目标 — 告诉我们你学习的理由,练习内容会围绕你的兴趣展开。 设定目标 →
-
追踪你的错误 — 发现让你反复出错的规律,并彻底改正它们。 查看我的错误 →
-
积累词汇量 — 练习中遇到的单词会被保存,并通过间隔重复来复习。 打开我的词汇表 →
-
练习口语 — 随时可以用说的来回答练习,而不用打字。 试试口语练习 →
-
训练发音 — 逐词获得即时的发音反馈。 训练发音 →
-
每天练一点点 — 适合你水平的简短每日练习,让语感保持新鲜。 开始练习 →
重点总结
- 过去完成进行时 = had + been + 动词-ing——had 不随主语变化。
- 用于表示某个动作在过去某一时间点之前持续的时间(for / since),或用近期原因解释过去的状态(she was wet — she'd been swimming)。
- 与**过去完成时(简单形式)**相比:简单形式 = 结果、数量或已完成的事件;进行式 = 进行中的动作或其持续时间。
- 与过去进行时相比:过去进行时 = 发生在过去某一具体时刻;过去完成进行时 = 持续到过去某个较晚时刻的时长。
- 状态动词(know、have、own、like 等)即使在过去时态里,表达持续时间时通常仍用简单形式:I'd known him for years.
- 否定形式:hadn't been + -ing。疑问句:Had + 主语 + been + -ing?