这是最好的时代,也是最坏的时代,生产力工具的不断进化,作为普通人面临的挑战也越来越巨大。
今天有幸使用 CHatGPT来编写代码,一起来看看吧,比如她是如何解答“TypeScript 怎么获取上个月的今天”这个问题的。
- Q: TypeScript 怎么获取上个月的今天
- ChatGPT:
您可以使用 JavaScript 中的 Date 对象来获取上个月的今天。以下是一种获取上个月的今天的 TypeScript 代码示例:
function getLastMonthToday(): Date { let today = new Date(); let year = today.getFullYear(); let month = today.getMonth() - 1; if (month < 0) { year--; month = 11; // 11 表示 12 月 } let date = today.getDate(); return new Date(year, month, date); }
该函数会返回上个月的今天,返回值为 Date 类型。在该函数中,我们首先获取当前日期,然后将月份减去1,得到上个月的月份。如果计算出的月份小于0,则需要将年份减1,将月份设置为12月。最后,我们将上个月的月份、年份和今天的日期作为参数,创建一个新的 Date 对象并返回它。
以下是一个示例,演示如何使用上面的函数来获取上个月的今天的日期字符串:let lastMonthToday = getLastMonthToday(); let dateString = lastMonthToday.toLocaleDateString(); // 格式化为本地日期字符串 console.log(dateString); // 输出格式:2022/01/14(以当前日期为例)
该代码将输出上个月的今天的日期字符串,例如 2022/01/14。
- (PS:好家伙,不仅生成了代码还告诉我们怎么使用)
- Q: 你这个代码有问题,上个月不一定有31号啊
- ChatGPT:
非常感谢您的指正,您说得对。我的代码确实有问题,因为上个月的日期可能不是31号。在实际使用中,需要对这种情况进行处理。
下面是一种修正后的 TypeScript 代码示例,该代码可以正确地获取上个月的今天:function getLastMonthToday(): Date { let today = new Date(); let year = today.getFullYear(); let month = today.getMonth() - 1; if (month < 0) { year--; month = 11; // 11 表示 12 月 } let lastDayOfMonth = new Date(year, month + 1, 0).getDate(); let date = Math.min(today.getDate(), lastDayOfMonth); return new Date(year, month, date); }
在这段代码中,我们首先获取当前日期,然后将月份减去1,得到上个月的月份。如果计算出的月份小于0,则需要将年份减1,将月份设置为12月。接着,我们使用 new Date(year, month + 1, 0) 来创建一个表示上个月最后一天的日期对象,使用 getDate() 方法获取这个日期对象的日期部分,即上个月最后一天的日期。最后,我们使用 Math.min() 方法比较上个月最后一天的日期和今天的日期,取较小值作为返回日期的日期部分,然后创建一个新的 Date 对象并返回它。
以下是一个示例,演示如何使用上面的函数来获取上个月的今天的日期字符串:let lastMonthToday = getLastMonthToday(); let dateString = lastMonthToday.toLocaleDateString(); // 格式化为本地日期字符串 console.log(dateString); // 输出格式:2022/01/14(以当前日期为例)
该代码将输出上个月的今天的日期字符串,例如 2022/01/14。
- Q: 如果我想返回 2022-01-14 这样格式的日期,应该怎么修改呢
- ChatGPT:
如果您想要返回 2022-01-14 这样格式的日期字符串,可以使用 toLocaleDateString() 方法的格式化参数来指定日期的格式。
以下是修改后的 TypeScript 代码示例function getLastMonthToday(): string { let today = new Date(); let year = today.getFullYear(); let month = today.getMonth() - 1; if (month < 0) { year--; month = 11; // 11 表示 12 月 } let lastDayOfMonth = new Date(year, month + 1, 0).getDate(); let date = Math.min(today.getDate(), lastDayOfMonth); let lastMonthToday = new Date(year, month, date); let dateString = lastMonthToday.toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' }); return dateString; }
在这段代码中,我们使用 toLocaleDateString() 方法的第一个参数指定日期的格式为 en-US,表示使用美国英语的日期格式,第二个参数是一个选项对象,指定年、月、日的输出格式。其中,year: ‘numeric’ 表示年份使用数值格式输出,例如 2022;month: ‘2-digit’ 表示月份使用两位数的格式输出,例如 01;day: ‘2-digit’ 表示日期使用两位数的格式输出,例如 14。
以下是一个示例,演示如何使用上面的函数来获取上个月的今天的日期字符串:let lastMonthToday = getLastMonthToday(); console.log(lastMonthToday); // 输出格式:2022-01-14(以当前日期为例)
该代码将输出上个月的今天的日期字符串,例如 2022-01-14。
- Q: 不对啊 为什么返回的是 01/14/2022 呢
- ChatGPT:
很抱歉,我在之前的回答中犯了一个错误。在 toLocaleDateString() 方法中,如果您想要返回 2022-01-14 格式的日期字符串,需要使用一个包含 year、month 和 day 属性的选项对象,而不是使用一个包含 dateStyle 和 timeStyle 属性的选项对象。
以下是修正后的 TypeScript 代码示例:function getLastMonthToday(): string { let today = new Date(); let year = today.getFullYear(); let month = today.getMonth() - 1; if (month < 0) { year--; month = 11; // 11 表示 12 月 } let lastDayOfMonth = new Date(year, month + 1, 0).getDate(); let date = Math.min(today.getDate(), lastDayOfMonth); let lastMonthToday = new Date(year, month, date); let options = { year: 'numeric', month: '2-digit', day: '2-digit' }; let dateString = lastMonthToday.toLocaleDateString('en-US', options).replace(/\//g, '-'); return dateString; }
在这段代码中,我们创建了一个包含 year、month 和 day 属性的选项对象,然后将其作为 toLocaleDateString() 方法的第二个参数传入,同时指定了日期格式为美国英语。最后,我们使用 replace() 方法将字符串中的斜杠 / 替换为短横线 -,以符合 YYYY-MM-DD 的日期格式。
以下是一个示例,演示如何使用上面的函数来获取上个月的今天的日期字符串:let lastMonthToday = getLastMonthToday(); console.log(lastMonthToday); // 输出格式:2022-01-14(以当前日期为例)
该代码将输出上个月的今天的日期字符串,例如 2022-01-14。
当然,细心的读者应该看出端倪了,如果我们一开始就具体地描述我们想要的,可能就不需要反复去修正答案了。从使用者的角度,要验证答案是否正确也是需要技巧的,当然我们也可以完全交给 AI 去测试。从这个案例中我们或许能够了解到当前问题下生成代码的注释中显示以当前日期为例获得的日期是 2022-01-14, 难道她还在 2022 年?此外,上述代码因地制宜的话还需将“en-US” 修改为 “zh”,但真正用于生产的话,估计……
总之,这是一次有趣的体验。