现在完成时 vs 一般过去时:终于讲明白的那条规则
"I lived here for five years" 和 "I have lived here for five years" 意思并不一样。一个问题就能决定该用哪个时态,外加 since 与 for、been 与 gone、美式例外,以及 30 个改错句。

1决定一切的那一个问题
关于这两个时态的解释,大多以各列六种用法开场。规则记不住,原因恰恰在此。其实只有一个问题,几乎能解决所有情况,而它根本不问动作本身。
问自己:那段时间结束了吗?不是动作——是那段时间。时间段关上了,用一般过去时;还敞着,用现在完成时。
「今天早上我喝了三杯咖啡」——上午十一点说,早上还在走,时间段是开的:I have drunk three coffees this morning。晚上八点说,早上已经过去,时间段关上了:I drank three coffees this morning。两句话里咖啡都同样喝完了,变的只是装着这个动作的盒子。
这就是为什么 "I have seen him yesterday" 在任何一种英语里都是错的。yesterday 是个关上的盒子,里面不可能还有事情在进行。时态和时间词互相打架。
往下读之前先试这三句:(a) I ___ (live) in Toronto for six years——而且我现在还住那儿。(b) I ___ (live) in Toronto for six years——后来我搬去了温哥华。(c) Shakespeare ___ (write) 37 plays。
(a) have lived——那六年还在走。(b) lived——那六年已经结束。(c) wrote——莎士比亚的一生永久关闭。最后一句是经典陷阱:剧本still在,但那个人不可能再写了。
Tip: 如果你能加上「而且现在仍然如此」或「而且还可能再发生」而句子不别扭,那你几乎肯定要用现在完成时。
2为什么你的母语让这件事变难
难度并不是平均分布的。你会犯哪种错,从你已经会的语言就能相当准确地预测,而知道自己那个专属陷阱,比记住通用规则更有用。
法语的 passé composé 和德语的 Perfekt 看上去与现在完成时一模一样——j'ai mangé、ich habe gegessen——但在口语里它们就是普通的过去时。直接照搬就得到 "I have eaten a sandwich yesterday"。形式对上了,职能没有。
斯拉夫语言把完成/未完成的区别放在动词体里,而不是单独的时态,所以没有可以对应的结构。常见结果是处处都用一般过去时:"I live here for five years" 或 "I already ate"。
波斯语用现在时标记持续的状态——字面是「我住这儿五年是」。阿拉伯语也类似。于是就出现 "I live here since 2019",而不是 "I have lived here since 2019"。破绽就在那个 since。
这两种语言都不按时间变位动词,靠语境和助词完成这项工作。没有东西可迁移,对的错的都没有,所以时态得从零建起——起步更慢,但日后固化的错误更少。
Tip: 找到上面属于你的那一行,再读一遍。知道自己往哪个方向偏之后,后面的内容会好懂得多。
3一般过去时:关上的盒子
一般过去时是英语默认的叙事时态。讲故事、罗列事件、回答「后来怎么了?」,干活的都是它。
规则动词加 -ed:worked、played、decided。不规则动词换形:go/went、see/saw、take/took。疑问和否定用 did 加动词原形——Did you go? I didn't go——主动词完全丢掉过去的标记。"Did you went" 是英语里最常见的初学者错误。
- 在明确过去时间完成的动作——She called me at nine
- 在隐含过去时间完成的动作——I spoke to the manager(双方都知道是什么时候)
- 故事里的一串事件——He opened the door, looked around, and left
- 已经停止的过去习惯——I smoked for ten years
- 过去的状态——She was a teacher before she retired
注意这五条里有四条,都跟「结果现在还算不算数」毫无关系。一般过去时不关心现在,而正是这份漠不关心把它区分开来。
Tip: 讲故事时,一旦把场景放在过去,就待在一般过去时里。学习者常常因为觉得某件事「有关联」而中途切到现在完成时,那会把叙事的线扯断。
4现在完成时:敞开的盒子
现在完成时不是过去时态。这句话值得再读一遍。从语法上说它是现在时——它描述当下的状况,把过去当作证据来用。
have 或 has 加过去分词:I have finished、she has gone、they have never tried。分词是第三种形式:go/went/gone、see/saw/seen、do/did/done。口语里缩写很正常——I've、she's、they've——刻意回避的学习者听起来会比本意正式得多。
"I have lost my keys" 说的是现在:钥匙现在找不到。"I lost my keys" 说的是当时:这事发生过,现在可能仍然如此也可能不是。所以「你钥匙呢?」的答案用完成时,「昨天怎么了?」的答案用一般过去时。
一个好用的画面:现在完成时从过去某一点一路画线到你说话的这一刻;一般过去时只在后头某处点一个点,跟现在断开。
绝不要把现在完成时和已结束的时间表达放在一起。不是 "I have finished it yesterday",不是 "She has called me last week",不是 "We have met in 2019"。只要出现关上的时间词,句子就必须是一般过去时。没有哪种英语方言能接受。
5会泄底的时间词
很多时候你压根不用想意思,只要找到一个词就能定时态。这两份清单值得背,因为它们覆盖了你真正会说的大部分内容。
- yesterday · last night · last week · last year
- in 2019 · in July · on Monday · at 3pm
- ago — two days ago, a long time ago
- when I was young · then · after that
- Any question starting with When — When did you arrive? never When have you arrived?
- since — since 2019, since I was a child
- for — for six years (when the period continues)
- already · yet · still · just
- ever · never — Have you ever been to Japan?
- so far · up to now · recently · lately
- this week / this month / this year — while they are still running
- It's the first time… · It's the best… I've ever…
其中两个有歧义,需要留神。for 两个时态都能用,但意思不同,见下一节。而 this morning / today 会随你说话的时点翻转,第一节已经演示过。
Tip: when 和 Have you ever 不能出现在同一个句子里。如果发现自己开口就是「When have you…」,停下来,改用 did 重来。
6since 和 for:人人都会搞混的一对
这两个不能互换,而且区别是机械的、不靠语感——这让它成为整个领域里最容易拿下的一分。
since 接某事开始的那一刻:since 2019、since Monday、since I moved here、since breakfast。它回答「从什么时候开始?」。since 几乎总会把现在完成时一起拽出来——"I have known her since university"。
for 接一段时长:for six years、for two hours、for ages、for a long time。它回答「持续多久?」。与 since 不同,for 两个时态都能配——而时态才是告诉听者「这事结束没有」的那部分。
仔细对比:"I worked at Google for five years" 意思是我现在不在那儿了;"I have worked at Google for five years" 意思是我还在。同样的词、同样的时长、相反的在职状态。面试时说错这句,你会以一种很要紧的方式被误解。
- I have lived here since 2020 — correct, starting point
- I have lived here for six years — correct, duration, still living here
- I have lived here since six years — wrong, mixes the two
- I live here since 2020 — wrong, needs Present Perfect
- I lived here for six years — correct, but I have moved out
Tip: since 的快速检验:能不能换成「从……那一刻起」?能就用 since。如果你想说的是「持续了多长一段时间」,那要用 for。
7been 和 gone 不是同一个词
两者都是与 go 相关的分词,互换会改变「谁在屋里」。一个小知识点,尴尬成本却高得反常。
"She has been to Paris" 意思是她某个时候去过,现在人在这儿。它描述经历。谈旅行时几乎每次你要的都是这个形式:Have you been to Canada? I've been to three countries this year。
"She has gone to Paris" 意思是她此刻人在巴黎,或者在路上。它描述位置。对着站在你旁边的人说这句,是真错,不是文体选择。
如果那个人在场,就不能用 has gone。"Where's Tom?" "He's gone to the bank"——对,他不在。但如果阿里就站在你旁边,那是 "He's been to the bank"——去了又回来了。
- I've been to that restaurant — I know it, I'm not there now
- I've gone to that restaurant — you would only say this from inside it, which is odd
- Have you ever been to India? — the standard experience question
- Have you ever gone to India? — grammatical but sounds wrong to native ears
8现在完成时真正承担的四件事
一旦接受了「盒子敞着」这条规则,传统那份用法清单就不再像四条各自独立的规则,而更像四种碰巧盒子还开着的处境。
Have you ever eaten sushi? I've never broken a bone. She's read all of Dickens。你的人生还在走,所以里面的一切都还开着。你一旦点名某个关上的时间段,它就翻转:"Did you eat sushi in Tokyo?"
I've lost my wallet——它现在不见了。She's broken her leg——现在打着石膏。They've finished the report——它现在可以用了。动作已经结束,重点在后果。
I've worked here for three years. We've known each other since school. It's rained all week。这正是大多数语言用现在时处理的用法,因此干扰性错误也最多。
I've just seen your message. The government has announced new rules。标题和公告住在这里——直到挂上具体时间,那时它们就变成一般过去时:"The government announced the rules on Tuesday"。
Tip: 报纸不停地在演示这个套路:标题用现在完成时讲消息本身,第一段一旦补上时间和地点就切到一般过去时。带着这个念头去读任何新闻网站,两篇之内你就会看见。
9你该知道的那个美式例外
如果你曾被老师纠正,转头又听见母语者反着说,多半就是这一节的缘故。
在美式英语里,英式英语要求现在完成时的地方常常用一般过去时,尤其是配 already、yet 和 just。"Did you eat yet?" 和 "I already told you" 在美国完全正常;在英国则是 "Have you eaten yet?" 和 "I've already told you"。
这个例外范围很窄:只涉及 already、yet、just,以及程度较轻的新近消息句。它不延伸到 since、for、ever、never,也不适用于「已结束时间」那条规则。"I have seen him yesterday" 在波士顿和在曼彻斯特一样错。
考试——雅思、CELPIP、托福、剑桥——请用英式写法。它永远不会被判错,而美式变体则可能因考官而异被扣分。日常对话两种都行;跟着对方走。
Tip: 知道这一点,主要是为了让你在美剧里听到 "Did you finish yet?" 时,不至于怀疑一条自己学对了的规则。
10三十个句子,逐句改正
把右边遮住,看答案之前先改每一句。这些取自真实学习者写作中出现频率最高的错误,所以这里得分低,反而是很有用的信息。
- I have seen him yesterday → I saw him yesterday
- I live in Berlin since 2019 → I have lived in Berlin since 2019
- When have you arrived? → When did you arrive?
- She has called me last night → She called me last night
- I am here since two hours → I have been here for two hours
- Did you ever go to Japan? → Have you ever been to Japan?
- I have lost my keys yesterday → I lost my keys yesterday
- He has gone to the shop, he's back now → He has been to the shop
- I know her since 2015 → I have known her since 2015
- We have met in 2019 → We met in 2019
- I have finished it two hours ago → I finished it two hours ago
- How long do you work here? → How long have you worked here?
- I didn't see that film yet → I haven't seen that film yet
- She is a teacher for ten years → She has been a teacher for ten years
- I have went to the bank → I have gone to the bank
- Shakespeare has written 37 plays → Shakespeare wrote 37 plays
- I have lived here since six years → I have lived here for six years
- Have you finished your work last week? → Did you finish your work last week?
- I never ate octopus → I have never eaten octopus
- This is the first time I go to Paris → This is the first time I have been to Paris
- I have been working here since three years → I have been working here for three years
- My father has died in 2010 → My father died in 2010
- I have already sent it last Monday → I already sent it last Monday
- It's raining since this morning → It has been raining since this morning
- How many times did you visit Canada? (so far, in your life) → How many times have you visited Canada?
- The train has left ten minutes ago → The train left ten minutes ago
- I have studied English when I was a child → I studied English when I was a child
- She has wrote me a letter → She has written me a letter
- We are married for twenty years → We have been married for twenty years
- Have you seen the news this morning? (said at 9pm) → Did you see the news this morning?
Tip: 最后一句是整份清单里最精细的测试。那句话没有任何地方是错的,错的只是墙上的钟。
11明白规则之后仍然会翻车的地方
这四种错误在规则被理解之后还能活很久,因为没有一种是「不知道规则」造成的。
分词本身错了。"I have went"、"she has wrote"、"they have took"——时态选对了,动词形式没对。现在完成时要第三种形式,而不规则动词被成对记住的次数远多于成三记住。如果你是这种情况,该练的是分词,不是时态。
你在句子中途卡壳。说话的人常常开头是对的,然后往回修:"I have… I lived here for six years." 时间压力之下,母语获胜。这是披着语法外衣的流利度问题,靠开口练习见效,靠再学一遍不管用。
长句会跟丢。五个词的句子里规则用得好好的,二十个词的句子里就丢了,因为说到末尾你已经不再盯着自己开启的那个时间框架。写作任务里尤其要留意。
没有人纠正你。两个时态都能产出听得懂的句子,于是对方听懂了就往下走。错误从不受罚,因此也从不被察觉——正是这套机制让「假朋友」词汇活上好几年。
犯第一种错就练分词,犯第二种就多说话。把规则重读一遍,两种都治不好——而这正是学习者明明懂了却仍觉得卡在这里的最常见原因。
12用真实内容修正,而不是再背一条规则
规则你现在已经读过了。如果读规则就够,事情到这里就结束了——可你多半以前也读过某个版本,而你还在这儿。
真正把知识变成习惯的,是在你认得出的处境里听到正确形式,次数多到它能抢在错误形式之前冒出来。一个母语者在等误点列车时说 "I've been here since eight",他把时态和处境一起存了下来。下次轮到你等车,正确形式就会先到。
这也是孤立的语法练习难以迁移到口语的原因。填空题教你在两个摆在眼前的选项之间挑一个,还给你无限时间;对话两样都不给。你需要的能力是在压力下把它调出来,而这只能靠输入加输出来搭建。
- 看或听你本来就会看的东西,只不过换成英语
- 留意每一个 have/has 加分词——新闻节目里密度极高
- 遇到一个就问它为什么不是一般过去时;答案永远是盒子还开着
- 存整句,不要存规则,更不要存孤立的动词
- 复习到你能把整句说出来,再把它的句式用进自己的句子里
Tip: FlexiLingo 在 YouTube 和播客上叠加互动字幕,你可以点任意单词查看释义和 CEFR 等级,再连同它所在的整句一起收藏——正是这一节所主张的那个单位。
常见问题
问那段时间结束了没有,而不是问动作结束了没有。时间段关上了——yesterday、last week、in 2019——用一般过去时;还开着——today、this year、我这一辈子、since 2020——用现在完成时。"I drank three coffees this morning" 晚上八点说是对的,上午十一点说是错的,因为唯一变化的只是早上有没有过去。
因为 yesterday 是关上的时间段,而现在完成时要求敞开的时间段,时态和时间表达互相矛盾。这不是英式或美式的偏好,而是哪里都错。要么去掉时间词——"I have seen him"——要么换时态——"I saw him yesterday"。
since 标记起点(since 2019、since Monday、since I moved here),for 标记时长(for six years、for two hours)。since 几乎总是搭现在完成时。for 两个都能搭,而意思由时态承载:"I worked there for five years" 表示你已经离开,"I have worked there for five years" 表示你还在。
has been to 表示那个人去过又回来了,描述的是经历:"She has been to Paris three times"。has gone to 表示人还在那儿:"She has gone to Paris"——他此刻不在。如果那个人就站在你面前,has gone 是不可能的。
是的,而且这是标准美式英语。美式用法允许 already、yet、just 搭一般过去时,而英式英语在这些地方要求现在完成时。例外到此为止——它不覆盖 since、for、ever、never,也不覆盖「已结束时间」那条规则。雅思、CELPIP、托福和剑桥考试请用英式写法,它永远不会被判错。
先弄清楚你实际犯的是哪一种错。如果你说 "I have went",问题出在不规则分词,不在时态。如果你在句子中途自我纠正,问题是压力下的流利度。如果只在长句里翻车,那是你把时间框架跟丢了。这三种没有一种靠重读规则能解决——它们分别需要分词训练、开口练习和写作复查。