Skip to content

Instantly share code, notes, and snippets.

@wonderb0lt
Last active April 11, 2019 12:05
Show Gist options
  • Save wonderb0lt/a2311c74e0a6dc9a7fa20c05fe06dc99 to your computer and use it in GitHub Desktop.
Save wonderb0lt/a2311c74e0a6dc9a7fa20c05fe06dc99 to your computer and use it in GitHub Desktop.
Some samples from an internal Zühlke presentation about JSR-354 and the new Date API
import org.javamoney.moneta.FastMoney;
import org.javamoney.moneta.Money;
import org.javamoney.moneta.format.CurrencyStyle;
import javax.money.*;
import javax.money.convert.CurrencyConversion;
import javax.money.convert.MonetaryConversions;
import javax.money.format.AmountFormatQuery;
import javax.money.format.AmountFormatQueryBuilder;
import javax.money.format.MonetaryAmountFormat;
import javax.money.format.MonetaryFormats;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.TextStyle;
import java.time.zone.ZoneOffsetTransition;
import java.time.zone.ZoneRules;
import java.util.*;
public class Main {
public static void main(String[] args) {
System.out.println("===java.util.currency===");
javaUtilCurrency();
System.out.println("===javax.currency===");
javaxCurrency();
System.out.println("===java.time===");
javaTime();
}
private static void javaUtilCurrency() {
Currency currency = Currency.getInstance(Locale.US);
System.out.println(currency.getSymbol()); // $
System.out.println(currency.getCurrencyCode()); // USD
System.out.println(currency.getDefaultFractionDigits()); // 2
}
private static void javaxCurrency() {
MonetaryRounding roundingToTwoDecimalsRoundingUp = Monetary.getRounding(
RoundingQueryBuilder.of().setScale(2).set(RoundingMode.HALF_UP).build()
);
MonetaryRounding roundingToFullHalfUp = Monetary.getRounding(
RoundingQueryBuilder.of().setScale(0).set(RoundingMode.HALF_UP).build()
);
MonetaryRounding roundingToFullHalfDown = Monetary.getRounding(
RoundingQueryBuilder.of().setScale(0).set(RoundingMode.HALF_DOWN).build()
);
// CurrencyUnit
CurrencyUnit usd = Monetary.getCurrency("USD");
System.out.println(usd.getCurrencyCode()); // USD
System.out.println(usd.getDefaultFractionDigits()); // 2
// Monetary Amounts + Arithmetic
double thirtyCents = 0.2 + 0.1; // 0.30000000000000004
Money twentyCents = Money.of(0.2, "EUR");
Money tenCents = Money.of(0.1, "EUR");
twentyCents.add(tenCents); // EUR 0.3
// Monetary Amounts + Arithmetic - finer points
Money twentyEuros = Money.of(20, "EUR");
twentyEuros.divide(3); // EUR 6.666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667
twentyEuros.divide(3).with(roundingToTwoDecimalsRoundingUp); // EUR 6.67
twentyEuros.divideAndRemainder(3); // [EUR 6, EUR 2]
// Monetary Rounding
Money einsfuffzisch = Money.of(1.5, "EUR");
System.out.println(einsfuffzisch.with(roundingToFullHalfUp)); // EUR 2
System.out.println(einsfuffzisch.with(roundingToFullHalfDown)); // EUR 1
// Why not use BigDecimal?
FastMoney.of(0.2, "EUR")
.add(FastMoney.of(0.1, "EUR"));
// = 0.30000000000000004
Money tenDollarCents = Money.of(10, "USD");
//tenDollarCents.add(tenCents); // javax.money.MonetaryException: Currency mismatch: USD/EUR
MonetaryAmountFormat myFormat = MonetaryFormats.getAmountFormat(fancyMoneyFormat());
System.out.println(myFormat.format(twentyEuros)); // 20,00€
// Currency Conversion
CurrencyConversion dollarConversion =
MonetaryConversions.getConversion("USD");
Money twentyEurosInDollars =
twentyEuros.with(dollarConversion); // USD 22.553972
}
private static AmountFormatQuery fancyMoneyFormat() {
return AmountFormatQueryBuilder.of(Locale.GERMAN).set(CurrencyStyle.SYMBOL).set("pattern", ".00 ¤").build();
}
private static void javaTime() {
long time = System.currentTimeMillis();
// Just no.
Date date = new Date();
System.out.println(date); // Wed Apr 10 15:28:45 CEST 2019
// Can't do any maths, can't do anything useful, really.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 17); // Result: Next day, 5AM. WTF?
calendar.set(Calendar.HOUR_OF_DAY, 17); // Finally time for a beer!
System.out.println(calendar.getTime()); // Wed Apr 10 17:00:24 CEST 2019
// Not completely useless, but confusing.
Instant now = Instant.now();
System.out.println(now.toString()); // 2019-04-10T15:35:58.302Z
System.out.println(LocalDate.now()); // 2019-04-11
System.out.println(LocalTime.now()); // 11:11:22.591
System.out.println(LocalDateTime.now()); // 2019-04-11T11:17:25.933
Instant nowInstant = ZonedDateTime.now().toInstant();
// Ist es Sommerzeit? true
System.out.printf("Ist es Sommerzeit? %b\n",
ZoneId.systemDefault()
.getRules()
.isDaylightSavings(nowInstant)
);
// Welcher Wochentag ist der nächste Monatsbeginn? Mittwoch
System.out.printf("Welcher Wochentag ist der nächste Monatsbeginn? %s\n",
LocalDate
.now()
.plusMonths(1)
.withDayOfMonth(1)
.getDayOfWeek()
.getDisplayName(TextStyle.FULL, Locale.GERMAN)
);
ZoneId myTimeZone = ZoneId.systemDefault();
ZoneRules rules = myTimeZone.getRules();
ZoneOffsetTransition nextTransition = rules.nextTransition(Instant.now());
// Am 2019-10-27, Uhrzeit 03:00 wird die Uhr um PT-1H Stunden verstellt
System.out.printf("Am %s, Uhrzeit %s wird die Uhr um %s Stunden verstellt",
nextTransition.getInstant().atZone(myTimeZone).toLocalDate(),
nextTransition.getDateTimeBefore().toLocalTime(),
nextTransition.getDuration());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment