先给结论:判断这道题用哪种时态,只看两个问题——① 句中有没有明确的过去时间词(yesterday、last year、in 2010、when she was young)?有,就选一般过去时。② 动作的结果或状态是不是一直延续到现在?是,就选现在完成时(have/has + 过去分词)。中文靠「去年去了」「已经吃了」这类时间词和「了/过」来补足信息,而英语把这两种信息全部压进动词形态里,这正是选择题的考点。
下面的 30 道题按「基础 · 初中水平 → 进阶 · 高中水平 → 挑战 · 大学·四六级」分为三组,每道题点击选项后立即批改,并给出中文解析:不只告诉你正确答案,还会指出中文母语者在这里最容易踩的坑——比如「我昨天吃了饭」的「了」会诱使你误选现在完成时。
现在完成时 vs 一般过去时:30 题小测
基础 · 初中水平
进阶 · 高中水平
挑战 · 大学·四六级
答案与解析完成练习后展开查看。
- 1. have finishedI 的现在完成时形式是 have finished,already 通常与完成时搭配。I finished my homework already 在美式口语中也较常见,但标准写法按完成时选择 have finished。
- 2. wentlast year 是明确的过去时间点,必须用一般过去时 went。中文「她去年去了日本」里也有「了」,但英语的逻辑是:只要给出具体过去时间,动词就要「退回」过去式,与中文的说法习惯无关。
- 3. eatenever(曾经)问的是到目前为止的人生经验,用现在完成时,动词用过去分词 eaten。中文「你吃过寿司吗」的「过」恰好对应现在完成时的经验用法——这是「过」少数能直接对上号的场合。注意别填成过去式 ate。
- 4. have knownsince 2019 表示从过去某点延续到现在,用现在完成时 have known,且主语是 we,助动词用 have。中文说「我们从 2019 年起就认识」,动词「认识」没有任何变化——中文母语者最容易在这里漏掉 have + 过去分词。
- 5. has lost丢钥匙发生在过去,但现在「打不开门」这个结果是它的直接后果,强调对现在的影响 → 现在完成时 has lost。中文「他把钥匙弄丢了」只用一个「了」,不会区分这两种情况。
- 6. livedin 2010 是封闭的过去时间点:那一年住在那儿,现在是否还住不知道也不关心 → 一般过去时 lived。看到「in + 年份」就条件反射选过去式,是最可靠的规则。
- 7. have seen「看了三次」是到目前为止累积的经验,用现在完成时 have seen。中文「我看了这部电影三次」的「了」在这里反而不对应完成时——次数经验在英语里归属现在完成时的「经验用法」。
- 8. hasjust(刚刚)固定搭配现在完成时,主语 the train 是单数,所以用 has。中文「火车刚开走了」用「刚」表达同样的时间关系,但英语里 just 已经决定了时态,不能再套用过去式。
- 9. wrote莎士比亚已经去世,他写作的人生已经「关闭」,再也没法给他增加新作品 → 一般过去时 wrote。中文没有这条规则——「莎士比亚写了很多戏剧」和「我昨天写了很多作业」动词形态完全一样,这是必须刻意建立的英语思维。
- 10. metyesterday 直接锁定一般过去时 met。哪怕句子的重点是「碰见了」这件事本身,只要出现 yesterday,现在完成时就没有资格出场——这题考的就是抵抗中文「昨天碰到了他」的「了」。
- 11. have known仍然是朋友说明这一关系持续到现在,have known 表达从过去到现在的时长。Know 表示认识时通常不用进行时。
- 12. have lost后半句「现在到处找不到」说明丢了这件事的结果仍然有效 → have lost。如果只说 lost,听者会觉得你在陈述一件与现在无关的旧事。中文「我手机丢了」一句话搞定,英语必须让时态替你说明「现在还找不着」。
- 13. did问已发生动作的具体时间,用 did + 动词原形:When did you buy…?现在完成时原则上不和 when 连用,因为 when 追问的是一个具体过去时间点,那是一般过去时的领地。中文「你什么时候买的这件夹克」没有这个限制。
- 14. have been tothis month 还没结束,「去了两次」是累积经验 → 现在完成时;been to 表示「去过(已经回来了)」,gone to 表示「去了(还没回来)」。中文「这家店我们这个月去过两次」的「过」在这里又一次精准对应完成时。
- 15. met … have been相遇发生在 2018 年这个封闭时间点 → met(一般过去时);「从那以后一直是朋友」延续至今 → have been(现在完成时)。中文两句都用「认识了…后来一直是朋友」,动词形态不变,英语却要求同一句话里切换时态。
- 16. Have youever been to 问「此生有没有去过」的人生经验 → Have you ever been to…?Did you 问的是某次具体行为。中文「你去过伦敦吗」只靠「过」一个字,英语则要用整个完成时结构。
- 17. opened … has openedin 1995 是封闭时间点 → opened;since then(从那以后至今)→ has opened。同一句话里两种时态并肩出现,是高中考试的经典题型,也是中文母语者最容易「顺手全写过去式」的地方。
- 18. has broken「你看!」意味着窗户现在就碎在那儿,说话人关注的是眼下的结果,而不是追究过去哪一刻碎的 → has broken。中文「有人把窗户打破了」无法体现这层差别,只能靠英语时态表达。
- 19. has gonehas gone to = 去了还没回来(人不在);has been to = 去过且已回来。Tom 不在场,所以用 has gone。中文「他去了银行」里的「了」反而更像 has gone——但别把这种对应当成普遍规律,「了」在别的句子里会指向完全不同的时态。
- 20. preferredwhen she was young 把这件事锁死在过去 → 一般过去时 preferred。哪怕说的是一段长期偏好(更像「状态」而不是「动作」),只要时间状语是封闭的过去,就用过去式——中文「她年轻时更喜欢喝茶」的动词毫无变化。
- 21. have ever「到目前为止我看过的最好的电影」→ 现在完成时:the best … I have ever seen。最高级 + ever 是完成时的固定句型。中文「这是我看过的最好的电影」完全看不出来需要完成时,只能靠句型记忆。
- 22. broke这是全卷最经典的陷阱:虽然「现在还走不好路」,但 last month 是明确的过去时间点 → 必须用 broke。中文母语者看到「影响到现在」就条件反射选现在完成时(has broken),恰恰中招。规则优先级:明确过去时间词 > 现在的结果。
- 23. haven't metsince 从过去某点连到现在 → 现在完成时否定式 haven't met。注意 since 从句里用过去时 left(离开是过去的事),主句用完成时——两件事「时态分工」,中文里「毕业以后我们就没再见过」完全无此区分。
- 24. heardnever 与现在完成时连用,have never + 过去分词 heard。heared 是高频拼写错误(hear 的过去分词是不规则变化 heard,不是 heared)。中文「我从来没听过他们」的「听过」会让人忘记英语这里需要过去分词。
- 25. has welcomed … openedsince 引导的从句用一般过去时 opened(开门是 1972 年的封闭事件),主句用现在完成时 has welcomed(迎接游客延续至今)。这个「主句完成时 + since 从句过去时」的分工是四六级必考点。
- 26. haven't readyet(还、尚)固定搭配现在完成时的否定式 haven't read。中文「我还没读那本书」的「还没…」结构对应得很好,但中文动词「读」不变形,英语必须 have + 过去分词 read(拼写不变、发音变 /red/)。
- 27. has looked前半句 last week → quit(过去式);后半句 since then → has looked(延续至今)。一句话两次切换:先陈述封闭的过去事件,再说它开启的、一直持续到现在的状态。中文两句动词都不变形。
- 28. Have you finished提问者关心的是「现在报告好了没有」(当前状态)→ Have you finished?回答者给出了具体时间(an hour ago)→ 换回过去时 sent。这条「问完成时、答过去式」的对话规律是中文里完全不存在的机制。
- 29. went「她小时候」是已经关闭的人生阶段,不可能再增加内容 → went。和莎士比亚同一逻辑:主体那段经历结束了,就用过去时。中文「我奶奶小时候坐公交车上学」没有任何形态变化提醒你这一点。
- 30. have discoveredScientists 是复数主语,recently 表示近期发生并与现在相关,用现在完成时 have discovered。
规则速览:三步锁定时态
做选择题时按固定顺序问自己三个问题,可以先缩小需要比较的时态范围:第一步,找过去时间词(yesterday、last week、in 2010、when I was a child)——只要出现,直接选一般过去时,这步优先级最高。第二步,没有时间词时,看动作是否延续到现在或结果是否影响现在(since、for、so far、already、yet、just)——是,就选现在完成时。第三步,仍然拿不准时,想中文句子强调什么:讲「这件事发生在过去某刻」用过去式,讲「这件事和现在有关」用完成时。
- 一般过去时:yesterday / last year / in 2010 / two days ago / when she was young → 动词用过去式(went, lost, saw)。
- 现在完成时:since / for / already / yet / just / ever / never / recently / so far → have/has + 过去分词(have gone, has lost)。
- been to = 去过(已回来);gone to = 去了(还没回来)。
- when + 具体过去动作 → 用 did 提问,不用 have you…。
- since 从句用过去时,主句用现在完成时:since it opened in 1972, it has welcomed…
把「明确过去时间词是最高优先级」刻进肌肉记忆:哪怕句子里有「影响到现在」的意味,只要出现 last month、in 2018 这类词,正确答案一定是一般过去时。
常见陷阱:四个最容易丢分的句型
以下四个句型在考试和日常写作中出现频率最高,也是中文母语者错误率最集中的地方。做完上面的练习后,可以回来看看这四条是否都答对了。
- ✗ I have seen him yesterday. → ✓ I saw him yesterday.(yesterday 一票否决完成时)
- ✗ I have finished it two hours ago. → ✓ I finished it two hours ago.(ago 同样只配过去时)
- ✗ He has lived there since he has been born. → ✓ He has lived there since he was born.(since 从句必须用过去时,主句才用完成时)
- ✗ Did you ever been to Paris? → ✓ Have you ever been to Paris?(ever + been 是完成时套餐,不能拆开配 did)
- ✗ She has gone to Paris last week.(去了+具体时间混用)→ ✓ She went to Paris last week. 或 She has gone to Paris.(不提时间)
为什么中文母语者总在这里出错:「了/过」不是时态
汉语的「了」不能机械地对应某一个英语时态。I ate dinner at seven 叙述过去的时间;I have eaten dinner 说明到现在已吃过,当前可能不需要再吃。
这解释了两个方向的错误。第一个方向:中文「了」太勤快,「去年去了日本」「昨天吃了饭」里都有「了」,于是很多学习者把「有『了』= 现在完成时」当成规律,写出 I have seen him yesterday 这样的句子。第二个方向:反过来把「了」当成一般过去时的信号,导致 I lost my phone(现在还找不着)该用 have lost 的地方也用过去式。正确的做法是彻底放弃从「了/过」出发倒推时态,改为直接问英语的两个问题:有没有过去时间词?是否连接现在?
「过」在「你吃过寿司吗(经验)」「这个月去过两次(累积次数)」这两类句子里确实对应现在完成时的经验用法——可以把它们当作锚点记下来;其余所有情况,一律回到上面三步判断法。
如何有效练习:让判断快过母语直觉
时态选择是一种「速度游戏」:考试和口语中你没有时间慢慢分析,必须让三步判断法快过中文「了/过」的本能反应。建议每天完整做一遍上面的 30 题,连续做一周——同一批题重复做并不浪费,目标是把正确答案的反应时间压缩到两秒以内。做完后把错题的中文句子抄下来,在旁边用英语重写一遍并标注判断依据。
更有效的做法是把练习搬进自己的写作:把邮件、作文或日记贴进 PromGee 的免费语法检查工具,它会标出每一个时态选择问题并解释对应的规则——你写错的句子,就是你最需要的那套练习题。
一顿饭,两种不同的时间视角
I ate dinner at seven 报告过去七点发生的事;I have eaten dinner 可以说明现在不饿或不需要再吃。Already、just 和 yet 不是自动选择时态的开关:美国英语常用 I already ate。判断具体语境,并避免 I have eaten dinner yesterday 这样的组合。
继续练习
常见问题
现在完成时和一般过去时到底怎么区分?
看两件事:句中有明确的过去时间词(yesterday、last year、in 2010)就用一般过去时;动作或状态延续到现在、或强调对现在的影响(since、for、already、yet、just)就用现在完成时。中文的「了/过」是体标记不是时态,不能作为判断依据。
yesterday 能和现在完成时连用吗?
不能。yesterday、ago、last week、in 2010 这类明确的过去时间词只与一般过去时连用:I saw him yesterday,而不是 I have seen him yesterday。这是中文母语者最常见、扣分最重的错误之一。
中文的「了」是不是就等于现在完成时?
不是。「了」是完成体标记,可以出现在过去(我昨天吃了)、将来(等我到了就吃了饭)等多种时间里。只有「去过/见过/吃过」这类表经历的「过」句,才常常对应现在完成时的经验用法。判断时态请回到英语自身的时间词和现在关联上。
让 AI 检查你作文里的每一个时态
规则看懂了,轮到自己写就容易漏。把你的英语作文或邮件贴进 PromGee 免费语法检查工具,AI 会标出每处时态问题并即时解析——把你的真实错误变成下一套练习题。
免费检查我的英语作文