Maison >développement back-end >Golang >L'algorithme de conversion Go Hour ne convertit pas correctement

L'algorithme de conversion Go Hour ne convertit pas correctement

WBOY
WBOYavant
2024-02-14 10:00:09800parcourir

Go 小时转换算法未正确转换

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.

Contenu de la question

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"))
}

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer