对于信用卡/借记卡的到期日期,我使用的数组包含自 2020 年到 2030 年以来的所有年份:
String[] expirationYearArray = { "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030" };
这是一个糟糕的方法,因为年份是硬编码的。这意味着3年后,即2023年,用户仍然可以选择2020年、2021年和2022年作为信用卡的到期日。这显然是错误的。我想做的是用今年到今年以后 10 年的字符串填充数组。我想做的是使用 Java 内置函数来获取当前年份。然后使用 for 循环进行 10 次迭代,并在每次迭代中从 Int 转换为 String,以便将 2020
转换为 "2020"
,然后推送该 "2020 "
作为 expirationYearArray
数组的第一个元素。 for 或 while 循环将继续执行此操作,直到到达第十次迭代。这种方法对您有意义吗?如果您看到不同的或更优化的选项可以用更少的代码执行相同的操作,或者它对您来说符合我的设想,请告诉我。谢谢。
最佳答案
避免对年份列表进行硬编码是个好主意。
至于您生成的年份范围,您可以向您的卡处理商核实规则。例如,在某些情况下,当设置为定期收费(例如订阅)时,可以对过期的卡进行收费,但新计划可能不应该接受它们。同样,信用卡的到期期限通常不会超过 10 年;您的处理器可能会拒绝过期时间过长的卡。
同样,处理器在执行时区方面可能不一致。有些人可能会考虑以本地时区结束一年,其他人可能会使用 UTC。最宽松的政策是使用 "anywhere on earth" zone,与 UTC 的偏移量为 -12:00。
为了使您的逻辑可测试,请传递 Clock
实例。通常,时钟将是系统默认时钟,但在这种情况下,您可以将区域设置为“世界任何地方”。通过传递时钟,您可以消除对实际时间的依赖,并测试您的计算在任何时间的表现。
private static final ZoneOffset aoe = ZoneOffset.ofHours(-12);
private static final DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu");
public static void main(String[] args) {
Clock clock = Clock.system(aoe);
List<Year> years = nextYears(clock, 10L);
years.stream().map(fmt::format).forEach(System.out::println);
}
private List<Year> nextYears(Clock clock, long count) {
return Stream.iterate(Year.now(clock), year -> year.plusYears(1L))
.limit(count)
.collect(Collectors.toList());
}
关于java - 包含信用卡过期年份的字符串数组,从当前年份算起再算 10 年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624102/