2

对于信用卡/借记卡的到期日期,我使用的数组包含从 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 循环将继续这样做,直到我达到第十次迭代。这种方法对您有意义吗?请让我知道您是否看到了一个不同的或更优化的选项,它可以用更少的代码做同样的事情,或者它对您来说是否符合我的设想。谢谢你。

4

4 回答 4

2

避免对年份列表进行硬编码是个好主意。

至于您生成的年份范围,您可以向您的卡处理器查询规则。例如,在某些情况下,过期的卡可以在设置为定期收费(如订阅)时收取费用,但新计划可能不应该接受它们。同样,信用卡通常会在 10 年内到期;您的处理器可能会拒绝过期时间过长的卡。

同样,处理器在时区的执行上可能不一致。有些人可能会考虑在其本地时区结束时结束一年,其他人可能会使用 UTC。最宽松的政策是使用“地球上的任何地方”区域,与 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());
}
于 2020-03-10T20:03:20.183 回答
2
于 2020-03-10T19:56:10.423 回答
1

这里有几个变种:

  public static void main(String[] args) {

    System.out.println(Arrays.toString(getExpirationYears(LocalDateTime.now().getYear())));
    System.out.println(Arrays.toString(getExpirationYears(Calendar.getInstance().get(Calendar.YEAR))));
    System.out.println(Arrays.toString(getExpirationYears(1900 + new Date().getYear())));
    System.out.println(Arrays.toString(getExpirationYearByStreams(1900 + new Date().getYear())));
}

static String[] getExpirationYears(int year) {
    String[] expirationYearArray = new String[10];
    for (int i = 0; i < expirationYearArray.length; i++) {
        expirationYearArray[i] = String.valueOf(year + i);
    }
    return expirationYearArray;
}


static String[] getExpirationYearByStreams(int year) {
   return IntStream.range(year, year+10)
            .boxed()
            .map(String::valueOf)
            .toArray(String[]::new);

}
于 2020-03-10T19:46:21.350 回答
0

这就是我按照 Nonika 的建议在我的代码中实现它的方式(见他的回答):

package com.myapp;
..........
public class Payment extends BaseActivity implements ResponseListener {
    ..........
    int currentYear = Calendar.getInstance().get(Calendar.YEAR);
    String[] cardYearArray = new String[10];
    ..........
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ..........
        cardYearArray=getExpirationYears(currentYear);
        SpinnerAdapter creditCardYearAdapter = new SpinnerAdapter(Payment.this,
            cardYearArray);
        ..........
    }
    static String[] getExpirationYears(int year) {
        String[] expirationYearArray = new String[10];
        for (int i = 0; i < expirationYearArray.length; i++) {
            expirationYearArray[i] = String.valueOf(year + i);
        }
        return expirationYearArray;
    }
    ..........
}

现在我看到年份正确显示,因为我需要它:

在此处输入图像描述

于 2020-03-10T23:16:55.873 回答