Maison > développement back-end > Golang > le corps du texte

L'algorithme de conversion Go Hour ne convertit pas correctement

WBOY
Libérer: 2024-02-14 10:00:09
avant
770 Les gens l'ont consulté

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"))
}
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal