现在完成时 have + 过去分词:到底在讲哪个时间?一句话分清楚
很多人第一次看到 I have lived here for three years.(我在这里住了三年了。)都会卡住:have 不是「有」吗?怎么后面接了一个动词?而且它讲的到底是过去还是现在?
会卡住很正常,因为中文没有跟**现在完成时(present perfect)**完全对应的讲法。它的结构是 have / has + 过去分词(past participle),而它真正想表达的,是一件很特别的事:过去发生的动作,跟现在有关联。 这篇就用一个简单的问句,带你把它跟一般过去时彻底分清楚。
内核概念:一只脚踩在过去,一只脚踩在现在
现在完成时最特别的地方,是它同时牵着两个时间。动作确实发生在过去,但说话的人在意的是它对现在造成的结果或影响。
想像一条时间线:左边是过去,最右边是「现在」这个点。一般过去时讲的事,整件落在左边,讲完就跟现在断开了;现在完成时讲的事,从过去一路连到现在这个点上,还在发生作用。
- I have lived here for three years.(我在这里住了三年了。)→ 过去搬来,到现在还住着
- She has finished her homework.(她写完功课了。)→ 过去写完,结果是现在功课已经完成
抓住这个画面,后面的用法就都有了方向。
用法一:人生经验,「曾经做过」
现在完成时很常拿来讲一辈子到目前为止的经验,重点在「有没有这个经验」,不在「什么时候」。
- I have been to Japan.(我去过日本。)
- Have you ever eaten durian?(你吃过榴梿吗?)
- He has never seen snow.(他从来没看过雪。)
这里常出现 ever(曾经)和 never(从来没有)。注意 have been to 是「去过某地(已经回来了)」这个固定讲法,很好用。
用法二:过去的动作,影响到现在
第二个用法是讲一件过去发生的事,而它的结果到现在还在。
- I've lost my keys.(我钥匙弄丢了。)→ 言下之意:现在还没找到
- She has broken her arm.(她手臂骨折了。)→ 言下之意:现在手还包着
- They have moved to a new house.(他们搬到新家了。)→ 言下之意:现在住在新家
对照一下你就懂这个「言下之意」有多重要:说 I've lost my keys. 是「我现在进不了门」;如果改用过去式说 I lost my keys yesterday, but I found them.(我昨天弄丢钥匙,但找到了。),那就只是在讲一段过去的小插曲,跟现在无关了。
信号词:句子里的时间线索
句子里常藏着信号词,看到它们就知道该往现在完成时想。
for 和 since:讲「持续多久」和「从何时起」
- for + 一段时间:I have studied English for five years.(我学英文学了五年了。)
- since + 一个起点:I have studied English since 2020.(我从 2020 年就开始学英文了。)
诀窍:for 后面接「多长」(two days、a week),since 后面接「从哪个点开始」(Monday、last year、2020)。
already / yet / just:讲事情的进度
- already(已经):I have already eaten.(我已经吃过了。)
- yet(还,用在否定与疑问句):Have you finished yet?(你做完了没?)/ I haven't finished yet.(我还没做完。)
- just(刚刚):She has just arrived.(她刚到。)
关键对比:跟一般过去时差在哪?
这是整篇最重要的一段。现在完成时和**一般过去时(past simple)**最大的差别在于:
- 一般过去时:讲一个明确的过去时间点,而且这件事跟现在无关,就是过去的一段纪录。
- 现在完成时:不讲明确的时间点,重点是它影响到现在。
看同一个动作怎么换时态:
- I lost my keys yesterday.(我昨天弄丢钥匙。)→ 有 yesterday,讲过去那一刻,用过去式
- I have lost my keys.(我把钥匙弄丢了。)→ 没讲时间,重点是现在还没找到,用完成时
判断诀窍(带得走的):先问自己——句子里有没有 yesterday、last week、in 2020、two days ago 这种明确的过去时间?
- 有 → 用一般过去时
- 没有,而且这件事影响到现在 → 用现在完成时
因为现在完成时一只脚还踩在「现在」,它不能跟一个锁死在过去的时间点同时出现。这就是为什么 I have seen him yesterday ✗ 不通:yesterday 把时间钉死在过去了,跟「连到现在」彼此打架。
常见错误
- 完成时配明确过去时间:
I have seen him yesterday✗ 要改成 I saw him yesterday. ✓(我昨天看到他了。)有 yesterday 就乖乖用过去式。 - 过去分词用错成过去式:
I have went to Japan✗ 要改成 I have been to Japan. ✓(我去过日本。)go 的三态是 go-went-gone,过去分词是 gone,别跟过去式 went 记混;讲「去过某地又回来了」习惯用 been,讲「去了还没回来」才用 gone。 - for 和 since 用反:
I have lived here since three years✗ 要改成 I have lived here for three years. ✓(一段时间用 for。) - 第三人称忘了用 has:
She have finished.✗ 要改成 She has finished. ✓(he/she/it 用 has。)
一句话帮自己分清楚
下次拿不定主意要用过去式还是完成时,先在心里问这一句:
「句子里有没有明确的过去时间点?这件事跟现在还有关系吗?」
- 有明确过去时间(yesterday、last year…),就是一段过去纪录 → 一般过去时
- 没讲明确时间,而且结果或经验连到现在 → 现在完成时(have / has + 过去分词)
如果你还在熟悉「现在」这几个时态的差别,可以回头看〈一般现在时 vs 现在进行时〉那篇,先把「现在」站稳,再往「连到现在」的完成时走,会顺很多。
在 Loopy 怎么练
时态这种东西,光记规则很容易考完就忘。真正记得住的方式,是在一句句真实句子里反复遇到它。Loopy 的分级课程会把现在完成时放进贴近 A2–B1 程度的对话情境,让你在听、说、跟读中亲耳听到母语者什么时候说 I've been to…、什么时候改口说 I went…;遇到 for/since、already/yet 这些信号词,也会在例句里一次次帮你加深印象,再配合记忆曲线安排复习,把它从规则变成你的直觉。
碰到不确定的过去分词(been、gone、seen、broken…),随手用字典查一下三态,顺便听发音跟着念。多练几回,你就会发现自己不用想也知道——这句到底在讲哪个时间。