Selaa lähdekoodia

improved date formatting with inspiration from strconv

Arne Hormann 11 vuotta sitten
vanhempi
commit
2aa37a1cca
1 muutettua tiedostoa jossa 22 lisäystä ja 21 poistoa
  1. 22 21
      utils.go

+ 22 - 21
utils.go

@@ -523,7 +523,8 @@ var zeroDateTime = []byte("0000-00-00 00:00:00.000000")
 func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value, error) {
 	// length expects the deterministic length of the zero value,
 	// negative time and 100+ hours are automatically added if needed
-	const pairs = "00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899"
+	const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+	const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
 	if len(src) == 0 {
 		if justTime {
 			return zeroDateTime[11 : 11+length], nil
@@ -555,7 +556,7 @@ func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value
 			hour := uint16(src[1])*24 + uint16(src[5])
 			pt = byte(hour / 100)
 			p1 = byte(hour - 100*uint16(pt))
-			dst = append(dst, '0'+pt)
+			dst = append(dst, digits01[pt])
 		} else {
 			p1 = src[5]
 		}
@@ -587,10 +588,10 @@ func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value
 		p1 = byte(year - 100*uint16(pt))
 		p2, p3 = src[2], src[3]
 		dst = append(dst,
-			pairs[2*pt], pairs[2*pt+1],
-			pairs[2*p1], pairs[2*p1+1], '-',
-			pairs[2*p2], pairs[2*p2+1], '-',
-			pairs[2*p3], pairs[2*p3+1],
+			digits10[pt], digits01[pt],
+			digits10[p1], digits01[p1], '-',
+			digits10[p2], digits01[p2], '-',
+			digits10[p3], digits01[p3],
 		)
 		if length == 10 {
 			return dst, nil
@@ -605,9 +606,9 @@ func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value
 	// p1 is 2-digit hour, src is after hour
 	p2, p3 = src[0], src[1]
 	dst = append(dst,
-		pairs[2*p1], pairs[2*p1+1], ':',
-		pairs[2*p2], pairs[2*p2+1], ':',
-		pairs[2*p3], pairs[2*p3+1],
+		digits10[p1], digits01[p1], ':',
+		digits10[p2], digits01[p2], ':',
+		digits10[p3], digits01[p3],
 	)
 	if length <= byte(len(dst)) {
 		return dst, nil
@@ -625,33 +626,33 @@ func formatBinaryDateTime(src []byte, length uint8, justTime bool) (driver.Value
 	switch decimals := zOffs + length - 20; decimals {
 	default:
 		return append(dst, '.',
-			pairs[2*p1], pairs[2*p1+1],
-			pairs[2*p2], pairs[2*p2+1],
-			pairs[2*p3], pairs[2*p3+1],
+			digits10[p1], digits01[p1],
+			digits10[p2], digits01[p2],
+			digits10[p3], digits01[p3],
 		), nil
 	case 1:
 		return append(dst, '.',
-			pairs[2*p1],
+			digits10[p1],
 		), nil
 	case 2:
 		return append(dst, '.',
-			pairs[2*p1], pairs[2*p1+1],
+			digits10[p1], digits01[p1],
 		), nil
 	case 3:
 		return append(dst, '.',
-			pairs[2*p1], pairs[2*p1+1],
-			pairs[2*p2],
+			digits10[p1], digits01[p1],
+			digits10[p2],
 		), nil
 	case 4:
 		return append(dst, '.',
-			pairs[2*p1], pairs[2*p1+1],
-			pairs[2*p2], pairs[2*p2+1],
+			digits10[p1], digits01[p1],
+			digits10[p2], digits01[p2],
 		), nil
 	case 5:
 		return append(dst, '.',
-			pairs[2*p1], pairs[2*p1+1],
-			pairs[2*p2], pairs[2*p2+1],
-			pairs[2*p3],
+			digits10[p1], digits01[p1],
+			digits10[p2], digits01[p2],
+			digits10[p3],
 		), nil
 	}
 }