/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
import java.time.* ;
import java.time.format.* ;
import java.time.temporal.* ;
import java.time.chrono.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
Ideone app = new Ideone( ) ;
app.demo ( ) ;
}
private void demo ( )
{
final Instant start = Instant.now ( ) .minus ( Duration.ofMinutes ( 21 ) ) ;
final Integer price
= 10 ; // This may come from some other place, such as a look-up in a database. Integer cost
= this .
calculateCostForElapsedTimeSoFar ( start , price
) ; System .
out .
println ( "cost: " + cost
) ; }
public Integer calculateCostForElapsedTimeSoFar
( final Instant start ,
final Integer price
) {
// Determine elapsed time.
Instant now = Instant.now ( ) ;
Duration elapsed = Duration.between ( start , now ) ;
// See how many chunks of 15 minutes have occurred.
Duration chunk = Duration.ofMinutes ( 15 ) ; // Charge for every chunk of time in chunks of 15 minutes. You could make this a constant instead of a local variable.
int chunks
= Math .
toIntExact ( elapsed.
dividedBy ( chunk
) ) ; // Returns number of whole times a specified Duration occurs within this Duration.
// Calculate charges.
return cost;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgppbXBvcnQgamF2YS50aW1lLiogOwppbXBvcnQgamF2YS50aW1lLmZvcm1hdC4qIDsKaW1wb3J0IGphdmEudGltZS50ZW1wb3JhbC4qIDsKaW1wb3J0IGphdmEudGltZS5jaHJvbm8uKiA7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCUlkZW9uZSBhcHAgPSBuZXcgSWRlb25lKCkgOwoJCWFwcC5kZW1vKCkgOwoJfQoJCglwcml2YXRlIHZvaWQgZGVtbyAoICkKICAgIHsKICAgICAgICBmaW5hbCBJbnN0YW50IHN0YXJ0ID0gSW5zdGFudC5ub3coKS5taW51cyggRHVyYXRpb24ub2ZNaW51dGVzKCAyMSApICk7CiAgICAgICAgZmluYWwgSW50ZWdlciBwcmljZSA9IDEwOyAgIC8vIFRoaXMgbWF5IGNvbWUgZnJvbSBzb21lIG90aGVyIHBsYWNlLCBzdWNoIGFzIGEgbG9vay11cCBpbiBhIGRhdGFiYXNlLgogICAgICAgIEludGVnZXIgY29zdCA9IHRoaXMuY2FsY3VsYXRlQ29zdEZvckVsYXBzZWRUaW1lU29GYXIoIHN0YXJ0ICwgcHJpY2UgKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJjb3N0OiAiICsgY29zdCApOwogICAgfQoJCglwdWJsaWMgSW50ZWdlciBjYWxjdWxhdGVDb3N0Rm9yRWxhcHNlZFRpbWVTb0ZhciAoIGZpbmFsIEluc3RhbnQgc3RhcnQgLCBmaW5hbCBJbnRlZ2VyIHByaWNlICkKICAgIHsKICAgICAgICAvLyBEZXRlcm1pbmUgZWxhcHNlZCB0aW1lLgogICAgICAgIEluc3RhbnQgbm93ID0gSW5zdGFudC5ub3coKTsKICAgICAgICBEdXJhdGlvbiBlbGFwc2VkID0gRHVyYXRpb24uYmV0d2Vlbiggc3RhcnQgLCBub3cgKTsKCiAgICAgICAgLy8gU2VlIGhvdyBtYW55IGNodW5rcyBvZiAxNSBtaW51dGVzIGhhdmUgb2NjdXJyZWQuCiAgICAgICAgRHVyYXRpb24gY2h1bmsgPSBEdXJhdGlvbi5vZk1pbnV0ZXMoIDE1ICk7IC8vIENoYXJnZSBmb3IgZXZlcnkgY2h1bmsgb2YgdGltZSBpbiBjaHVua3Mgb2YgMTUgbWludXRlcy4gWW91IGNvdWxkIG1ha2UgdGhpcyBhIGNvbnN0YW50IGluc3RlYWQgb2YgYSBsb2NhbCB2YXJpYWJsZS4KICAgICAgICBpbnQgY2h1bmtzID0gTWF0aC50b0ludEV4YWN0KCBlbGFwc2VkLmRpdmlkZWRCeSggY2h1bmsgKSApOyAgIC8vIFJldHVybnMgbnVtYmVyIG9mIHdob2xlIHRpbWVzIGEgc3BlY2lmaWVkIER1cmF0aW9uIG9jY3VycyB3aXRoaW4gdGhpcyBEdXJhdGlvbi4KCiAgICAgICAgLy8gQ2FsY3VsYXRlIGNoYXJnZXMuCiAgICAgICAgSW50ZWdlciBjb3N0ID0gKCBwcmljZSAqIGNodW5rcyApOwogICAgICAgIHJldHVybiBjb3N0OwogICAgfQp9