Ce que l'éditeur PHP Xinyi va vous présenter aujourd'hui est un problème dans le langage Go, c'est-à-dire que "l'algorithme de conversion des heures Go n'est pas converti correctement". En langage Go, la conversion de l'heure est une opération courante, mais dans certains cas, le résultat de la conversion des heures peut être erroné. Cet article expliquera en détail la cause de ce problème et fournira des solutions pour aider les développeurs à éviter les erreurs lors de l'utilisation du langage Go pour la conversion du temps.
Je suis tombé sur un défi hackerrank dans lequel j'étais censé créer une fonction qui convertit une chaîne dans un format d'heure donné du format 12 heures au format 24 heures.
J'ai réussi à le faire en utilisant le code ci-dessous, mais comme vous l'avez remarqué, il y a un cas particulier à 21h. Chaque fois que j'entre une heure qui commence par 09 (c'est la seule chose), elle convertit 09 en 12. J'ai donc dû créer un cas spécifique pour gérer ce problème, qui a fonctionné, mais je voulais comprendre pourquoi cela s'était produit. Sais-tu quel est le problème?
package main import ( "fmt" "strconv" "strings" ) type Conversion struct { conversion string } func timeConversion(s string) string { var conversion Conversion firstValue := fmt.Sprintf("%s%s", string(s[0]), string(s[1])) secondValue := fmt.Sprintf("%s%s", string(s[3]), string(s[4])) firstValueNumber, _ := strconv.ParseInt(firstValue, 0, 16) fmt.Print() if strings.Contains(s, "A") { if firstValue == "12" { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "00", secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } else { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", firstValue, secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } } else if strings.Contains(s, "P") { if firstValue == "12" { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "12", secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } else if firstValue == "09" { conversion.conversion = fmt.Sprintf("%s:%s:%s%s", "21", secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } else { conversion.conversion = fmt.Sprintf("%d:%s:%s%s", firstValueNumber+12, secondValue, string(s[len(s)-4]), string(s[len(s)-3])) } } return conversion.conversion } func main() { fmt.Print(timeConversion("09:08:23PM")) }
Si vous trouvez une erreur lors de la conversion de chaîne en entier, vous remarquerez que pour la valeur >7
, la conversion échoue
firstValueNumber, err := strconv.ParseInt(firstValue, 0, 64) if err != nil { fmt.Printf("%s", err.Error()) } // "08" results in invalid syntaxfirstValueNumber being printed
Cela se produit parce que vous passez 0 comme base, indiquant à parseint
从字符串的第一个字符推断基数。前导 '0'
qu'il s'agit d'une base octale, donc les nombres supérieurs à 7 ne seront pas valides. En revanche, passer 10 ne nécessite aucune manipulation particulière.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!