多种货币转换java算法,Java Money-特定日期的货币转换率

I'm trying to get exchange rate on specific date between EUR and USD. The issue is I'm allways getting exchange dare for date: LocalDate{year=2016, month=1, dayOfMonth=8} and it does not matter if I specify date in query.

Here are my maven dependencies:

javax.money

money-api-bp

1.0.1

org.javamoney

moneta-bp

1.1

Source code:

public class Test {

public static void main(String[] args) {

ConversionQuery query = ConversionQueryBuilder.of()

.setProviderName("ECB")

.setBaseCurrency(Monetary.getCurrency("EUR"))

.setTermCurrency(Monetary.getCurrency("USD"))

.set(LocalDate.class, LocalDate.of(2017, Month.SEPTEMBER, 10))

.build();

final ExchangeRateProvider provider = getExchangeRateProvider(query);

final ExchangeRate rate1 = provider.getExchangeRate(query);

System.out.println(rate1);

ExchangeRateProvider ecbExchangeRateProvider = MonetaryConversions.getExchangeRateProvider("ECB");

ExchangeRate rate = ecbExchangeRateProvider.getExchangeRate("EUR", "USD");

System.out.println(rate);

}

}

And the output from sout:

sep. 11, 2017 9:58:29 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded

INFO: Loaded ECBCurrentRateProvider exchange rates for days:1

sep. 11, 2017 9:58:30 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded

INFO: Loaded ECBHistoric90RateProvider exchange rates for days:63

ExchangeRate [base=EUR, factor=1.0861, conversionContext=ConversionContext (

{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})]

ExchangeRate [base=EUR, factor=1.0861, conversionContext=ConversionContext (

{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})]

ExchangeRate [base=USD, factor=0.9207255317189946, conversionContext=ConversionContext (

{provider=ECB, rateTypes=[DEFERRED], providerDescription=European Central Bank, days=1, org.javamoney.moneta.internal.convert.LocalDate=LocalDate{year=2016, month=1, dayOfMonth=8}, javax.money.convert.RateType=HISTORIC})]

sep. 11, 2017 9:58:35 AM org.javamoney.moneta.internal.convert.ECBAbstractRateProvider newDataLoaded

INFO: Loaded ECBHistoricRateProvider exchange rates for days:4358

Thanks!

解决方案

This API is currently obscure. If you get:

ConversionQueryBuilder.of().setTermCurrency("EUR").

set(LocalDate.class, LocalDate.of(2018, 1, 1)).build()

MonetaryConversions.getConversion(conversionQuery)

It will use following method:

default CurrencyConversion getConversion(ConversionQuery conversionQuery) {

return getExchangeRateProvider(conversionQuery).getCurrencyConversion(

Objects.requireNonNull(conversionQuery.getCurrency(), "Terminating Currency is required.")

);

}

As you can see, the conversionQuery is used to get the provider, not the conversion object itself. It's always returned for query with only currency set, never with date.

To make it working use:

MonetaryConversions.getExchangeRateProvider().getCurrencyConversion(conversionQuery)

I believe it should work consistently for all invocations.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值