java - 包含信用卡过期年份的字符串数组,从当前年份算起再算 10 年

标签 java android loops hardcode hardcoded

对于信用卡/借记卡的到期日期,我使用的数组包含自 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/

相关文章:

java - List<Object> 和 SqlRowSet 向下转型

android - React Native Android - 我如何*停止* <View> 在 Modal 中自动调整大小?

java - 安卓 SDK : BASE64 Encoder/Decoder not importing

java hashmap无法转换对象

java - 如何设置空白单元格的颜色

Android - 使用 Alpha 渐变动画闪烁图像

Image.onload() 的 JavaScript 循环/作用域问题

javascript - 循环无限嵌套对象并构造字符串

windows - 批处理文件 : Copy files to all subfolders

java - 如何使用 Talend Open Studio Data Integration 创建属性文件?