short history of time - confitura 2013

Post on 10-May-2015

1.342 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Short history of timeTomasz Nurkiewicz

 | 2013­07­09T16:35:50.090Z

nurkiewicz@gmail.com @tnurkiewicz

Tomasz Nurkiewicz | 

6+ years with JavaScala, JavaScript, Clojure...Back­end, data analysis and visualization

 | Used to be active on Third time speaker on Javarsovia/ConfituraWorking in Oslo ( )

nurkiewicz.blogspot.com

nurkiewicz@gmail.com @tnurkiewicz

scala.net.pl github.com/nurkiewiczStackOverflow

we are hiring!

Bad day at Microsoft

 blogs.msdn.com/b/windowsazure/archive/2012/03/09/summary­of­windows­azure­service­disruption­on­feb­29th­2012.aspx

Program result?Java:

C#:

Calendar cal = new GregorianCalendar(2012, FEBRUARY, 29, 15, 0);cal.add(YEAR, 1);System.out.println(cal.getTime());

DateTime cal = new DateTime(2012, 2, 29, 15, 0, 0).AddYears(1);Console.WriteLine(cal);

February 28th, 2013, 15:00February 29th, 2013, 15:00March 1st, 2013, 00:00March 1st, 2013, 15:00IllegalArgumentException

True story“[...] in accordance with Terms and Conditions [...] interest is paidfor actual number of days funds were on account [...] however it is

assumed that year consists of 365 days.Year 2012 has 366 days, thus 

interest is not paid for 29th of February.Yours faithfully, [some] Bank”

samcik.blox.pl/2012/03/Dzien­ktorego­nie­ma­Sprawdz­co­bank­wykreslil.html

Bad second for Linux

 www.greenprophet.com/2012/07/leap­second­bug­consumes­megawatts­of­electricity/

Leap seconds

 en.wikipedia.org/wiki/Leap_second

Inne błędyProblem of year 2000 (Y2K)Problem of year 2011 (Taiwan)Problem of year 2038 (Integer.MAX_VALUE)Problem of year 2042 (IBM S/370)Problem of year 2107 (MS­DOS FAT)Problem of September 9th, '99 (9/9/99)

en.wikipedia.org/wiki/Time_formatting_and_storage_bugs

Understand the domain...of every problem

Date representation

 www.edali.org/persistence­of­memory.jsp

Seconds since arbitrary moment in timeCalendar system

Time axis

Time "0"?Date Used in

0. January 0 MATLAB

1. January 0 Symbian, Turbo DB

1. January 1 Microsoft .NET, Go

1. January 1601 NTFS, COBOL, Win32/Win64

1. January 1753 Microsoft SQL Server

31. December 1840 MUMPS

17. November 1858 VMS, United States Naval Observatory, DVB SI, astronomia

30. December 1899 Microsoft COM DATE, Object Pascal

0. January 1900 Microsoft Excel, Lotus 1­2­3

1. January 1900 NTP, IBM CICS, Mathematica, RISC OS, Common Lisp

1. January 1904 LabVIEW, Mac OS 9, Palm OS, MP4

1. January 1950 SEGA Dreamcast

Date Used in

1. January 1960 S­Plus, SAS

31. December 1967 Pick OS

1. January 1970 Linux, Mac OS X, C, Java, JavaScript,

Perl, PHP, Python, Tcl, ActionScript

1. January 1978 AmigaOS

1. January 1980 DOS, OS/2, FAT16 I FAT32, VOS

6. January 1980 Qualcomm BREW, GPS

1. January 1981 Acorn NetFS

1. January 1984 CiA® CANopen®

22. August 1999 Satelita Galileo

1. January 2000 PostgreSQL, AppleSingle, AppleDouble

1. January 2001 Apple Cocoa

en.wikipedia.org/wiki/Epoch_date

java.util.Date:

vs.:

en.wikipedia.org/wiki/Calendar_date“A date in a calendar is a reference to a particular day

represented within a calendar system. [...] A particular day maybe represented by a different date in another calendar”

docs.oracle.com/javase/7/docs/api/java/util/Date.html“The class Date represents a specific instant in time, with

millisecond precision.”

Time zonesjava.util.Timezone

Time difference between Warsaw and Sydney?

 www.travel.com.hk/region/timezone.htm

DST (Daylight saving time)

 en.wikipedia.org/wiki/Daylight_saving_time

Daylight saving time

Winter → Summer Summer → Winteren.wikipedia.org/wiki/Daylight_saving_time

...so?

 www.travel.com.hk/region/timezone.htm

Representation

WRONG!final TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");

TimeZone.getTimeZone("GMT+01:00");

TimeZone.getTimeZone("Europe/warsaw");

Calendar datejava.util.Calendar

Leap years - WRONG! def leapYear(year: Int): Boolean = year % 4 == 0

Leap years - poor def leapYear(year: Int): Boolean = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

Leap years def leapYear(year: Int): Boolean = new GregorianCalendar(year, JANUARY, 1). getActualMaximum(DAY_OF_YEAR) > 365

PuzzleCalendar c = Calendar.getInstance();

System.out.println(c.get(Calendar.YEAR));

We have (Gregorian) year 2013

Meanwhile in Thailand...

...and in Japan...

$ java ...2013

$ java -Duser.country=TH -Duser.language=th ...2556

$ java -Duser.country=JP -Duser.language=ja -Duser.variant=JP ...25

Better:

Even better:

Just in case...

Calendar c = new GregorianCalendar();

Calendar c = new GregorianCalendar(timeZone);

Calendar c = new GregorianCalendar(timeZone, locale);

Date vs. Calendar?"...after some another event""...within 10 seconds""...within an hour""...within 24 hours""...within one day""...in 2013""...after 17:00""...on Friday"

Practice

Joda Timefinal DateTime yearLater = new DateTime(2012, 2, 29, 15, 0).plusYears(1);

joda­time.sourceforge.net

Joda Time and JAX-WSimport org.joda.time.DateTime;import javax.xml.bind.DatatypeConverter;

public class XsdJodaTimeConverter { public static DateTime unmarshal(String dateTime) { final long millis = DatatypeConverter. parseDate(dateTime). getTimeInMillis(); return new DateTime(millis); }

public static String marshal(DateTime calendar) { return DatatypeConverter.printDate( calendar.toGregorianCalendar() ); }}

JAX-WS: .xjb file<bindings version="1.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <globalBindings> <javaType xmlType="xs:dateTime" name="org.joda.time.DateTime" parseMethod="XsdJodaTimeConverter.unmarshal" printMethod="XsdJodaTimeConverter.marshal"/> </globalBindings></bindings>

Joda Time and JPA 2.1import org.joda.time.Instant;import javax.persistence.AttributeConverter;import javax.persistence.Converter;import java.util.Date;

@Converter(autoApply = true)public class JodaTimeConverter implements AttributeConverter<Instant, Date> {

@Override public Date convertToDatabaseColumn(Instant attr) { return attr != null? attr.toDate(): null; }

@Override public Instant convertToEntityAttribute(Date dbData) { return dbData != null? new Instant(dbData): null; }}

Testing - toolsControlled time source ( )"Exotic" default time zoneDon't sleep! (Thread.sleep()), ScalaCheck

fake system clock

Awaitility

Testing - edge casesBeginning/end of month/yearWeekends29th of FebruaryTime zones, DST

ScalaCheck and ScalaTest

Negative result

implicit override val generatorDrivenConfig = PropertyCheckConfig(minSuccessful = 10000, workers = 4)

test("any date +1 year and -1 year should yield same date back") { check { random: Date => { val plusMinusYear = new GregorianCalendar plusMinusYear.setTime(random) plusMinusYear.add(YEAR, 1) plusMinusYear.add(YEAR, -1) random == plusMinusYear.getTime } }}

Falsified after 2665 passed tests: arg0 = Mon Feb 29 03:21:22 CET 73843340

Events in the future,  , ...

QuartzJMS

Activiti jBPM

Quartz schedulernewTrigger() .startAt(futureDate(1, YEAR)) .build();

quartz­scheduler.org/documentation/quartz­2.1.x/tutorials/tutorial­lesson­05

JMS with delayMessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage("...hello, delayed!");message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, oneYearMillis);producer.send(message);

http://activemq.apache.org/delay­and­schedule­message­delivery.html

Bonus / Computus(defn easter [year] (let [ a (mod year 19) b (Math/floor (/ year 100)) c (mod year 100) d (Math/floor (/ b 4)) e (mod b 4) f (Math/floor (/ (+ b 8) 25)) g (Math/floor (/ (inc (- b f)) 3)) h (mod (+ (- (+ (* 19 a) b) d g) 15) 30) i (Math/floor (/ c 4)) k (mod c 4) L (mod (- (+ 32 (* 2 e) (* 2 i)) h k) 7) m (Math/floor (/ (+ a (* 11 h) (* 22 L)) 451)) n (- (+ h L 114) (* 7 m)) month (dec (Math/floor (/ n 31))) day (inc (mod n 31))] (java.util.GregorianCalendar. year month day)))

en.wikipedia.org/wiki/Computus

Bugs, more bugs...1.  "Due to the lack of [time] synchronization [...] a car bomb went off [...] one hour earlier than

expected" ( )2.  "F­22 Raptors [...] experienced multiple computer crashes coincident with their crossing of

[...] the International Date Line" ( )3.  "Damage to a German steel facility occurred during a DST transition" (

)4. 

5. 6.  Unjustified fraud accusation (  ­ [37])7.  Catalog of few hundred bugs, up to year 2000 (!) (

)

catless.ncl.ac.uk/Risks/20.58.html#subj12

en.wikipedia.org/wiki/List_of_software_bugs

en.wikipedia.org/wiki/Daylight_Savings_Timewww.wired.com/wiredenterprise/2012/07/leap­second­bug­wreaks­havoc­with­java­linuxwww.theregister.co.uk/2012/07/02/leap_second_crashes_airlines

www.cs.tau.ac.il/~nachumd/horror.html

www.csl.sri.com/users/neumann/cal.html

Interesting and useful1.   ­ everything about time2.   ­ UNIX time3.   ­ foundation for this presentation4.   ­ definitions of TAI, UT, UTC...5.   ­ Samoa and Tokelau skip a day for dateline

change

www.timeanddate.comwww.epochconverter.comwww.odi.ch/prog/design/datetime.phptycho.usno.navy.mil/systime.htmlwww.bbc.co.uk/news/world­asia­16351377

Thank you for your... time! 

Twitter: nurkiewicz@gmail.com

@tnurkiewicz

nurkiewicz.github.io/talks/confitura2013

top related