Avatar billede boholdt Mester
11. juli 2023 - 22:50 Der er 11 kommentarer og
1 løsning

Konvertering af måned numre til navne i ASP

Hej

Jeg har følgende kode som oplyser mig datoen for hvornår, at webserveren sidst er blevet genstartet:
---Start på kode---
<html>
<head>
<title>Tidspunkt for genstart af server</title>
<head>
<body>
<h1>Genstart af server</h1>
<p>
<%@ Language=VBScript %>
<%
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
   
    For Each objOperatingSystem in colOperatingSystems
        lastBootTime = objOperatingSystem.LastBootUpTime
        lastBootTime = CDate(Mid(lastBootTime, 5, 2) & "/" & Mid(lastBootTime, 7, 2) & "/" & Left(lastBootTime, 4) & " " & Mid(lastBootTime, 9, 2) & ":" & Mid(lastBootTime, 11, 2) & ":" & Mid(lastBootTime, 13, 2))
        Response.Write("Serveren blev sidst genstartet den " & lastBootTime)
    Next
%>
</body>
</head>
</html>
---Slut på kode---
Når jeg får vist hjemmesiden, vises navnene på månederne imidlertid som tal i stedet for navne.

Hvordan får jeg lavet koden korrekt, så månedrne vises som navne i stedet?

Helt konkret skal outputtet gerne se således ud med månedernes navne på dansk:
Serveren blev sidst genstartet den xx navn på måned xxxx klokken xx:xx:xx (x'erne repræsenterer tallene).

Jeg har forsøgt med følgende kode, som jeg har fundet via Google - men den fungerer ikke:
<%@ Language=VBScript %>
<%
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
   
    For Each objOperatingSystem in colOperatingSystems
        lastBootTime = objOperatingSystem.LastBootUpTime
        lastBootTime = CDate(Mid(lastBootTime, 5, 2) & "/" & Mid(lastBootTime, 7, 2) & "/" & Left(lastBootTime, 4) & " " & Mid(lastBootTime, 9, 2) & ":" & Mid(lastBootTime, 11, 2) & ":" & Mid(lastBootTime, 13, 2))
       
        ' Convert month number to month name
        monthNumber = Month(lastBootTime)
        monthName = MonthName(monthNumber)
       
        Response.Write("Last Reboot Time: " & monthName & " " & Day(lastBootTime) & ", " & Year(lastBootTime) & " " & Time(lastBootTime))
    Next
%>
---

Så hvis nogle derude kan modificere mit første kodeeksempel, så månederne vises som navne i stedet for tal vil det være fornemt.

Jeg håber, at mit spørgsmål giver mening.

På forhånd tak for svaret, og god dag.

Mvh Anders.
Avatar billede DanishBear Seniormester
12. juli 2023 - 00:52 #1
Nu er jeg kun en autodidakt

Kik eventuelt på
  https://www.w3schools.com/asp/func_weekdayname.asp
eller nok denne
  https://www.w3schools.com/asp/func_formatdatetime.asp

ellers er der nok andre her der kan komme med noget..

Mvh, DB
Avatar billede arne_v Ekspert
12. juli 2023 - 01:34 #2
MonthName er den rigtige funktion.

<%
Session.LCID = 1030
monnum = 7
monnam = MonthName(monnum)
Response.Write monnam
%>

udskriver pænt "juli".
Avatar billede claes57 Ekspert
12. juli 2023 - 15:57 #3
du kan ikke pille ved data...
lastBootTime = objOperatingSystem.LastBootUpTime
lastBootTime = CDate(Mid(lastBootTime,
det er to ting, og de kan IKKE hedde det samme. Ved linje #2 overskriver du den dato, som du har gemt i linje #1
Hvis du nu i linje #2 havde
DatelastBoot = CDate(Mid(lastBootTime,
og så i de efterfølgende linjer skifter alle "lastBootTime" ud med "DatelastBoot" så ville det nok virke.
Avatar billede arne_v Ekspert
12. juli 2023 - 16:14 #4
#3

Hvis man ikke skal bruge den gamle værdi senere er det ikke et problem at tildele en ny værdi til en variabel.
Avatar billede arne_v Ekspert
12. juli 2023 - 16:22 #5
Lidt nærlæsning siger at problemerne er at variablen monthName konflikter med den indbyggede funktion MonthName og at Time funktionen ikke kan bruges som den bliver brugt her.
Avatar billede claes57 Ekspert
12. juli 2023 - 16:24 #6
Men det kræver, at den gamle findes mens der skrives i den nye, og den dør nok, når første del sættes, og så mangler data for resten…
Avatar billede arne_v Ekspert
12. juli 2023 - 16:34 #7
myMonthName = MonthName(monthNumber)
        Response.Write("Last Reboot Time: " & myMonthName & " " & Day(lastBootTime) & ", " & Year(lastBootTime) & " " & two(Hour(lastBootTime)) & ":" & two(minute(lastBootTime)) & ":" & two(Second(lastBootTime)))

virker med:

function two(v)
    if v >= 10 then
        two = cstr(v)
    else
        two = "0" & cstr(v)
    end if
end function

Men det kan gøres nemmere.
Avatar billede arne_v Ekspert
12. juli 2023 - 16:41 #8
#6

Jeg har aldrig hørt om et programmeringsprog hvor højre side af assignment ikke blev færdig evalueret førend tildeling til venstre side blev udført.
Avatar billede arne_v Ekspert
12. juli 2023 - 16:46 #9
Det generer mig meget at konvertere fra String til Date og så konvertere  tilbage fra Date til String.

        lastBootTime = objOperatingSystem.LastBootUpTime
        Response.Write("Last Reboot Time: " & MonthName(CInt(Mid(lastBootTime, 5, 2))) & " " & Mid(lastBootTime, 7, 2) & ", " & Left(lastBootTime, 4) & " " & Mid(lastBootTime, 9, 2) & ":" & Mid(lastBootTime, 11, 2) & ":" & Mid(lastBootTime, 13, 2))
Avatar billede claes57 Ekspert
12. juli 2023 - 16:49 #10
Ok, men det er jublende dumt og forvirrende at bruge samme navn til flere ting. Det bør stoppes. Hvis man nu kalder en funktion, som forudsætter det første led, og funktionen kaldes efter den er omskrevet til andet led, så er der ingen, der ved, hvad der foregår og hvornår.
Avatar billede arne_v Ekspert
12. juli 2023 - 17:09 #11
#10

Det er jeg helt enig i.

Man bør bruge forskellige variable til forskellige data.

Og man bør også bruge forskellige variable til samme data som forskellige typer.

lastBootTime = objOperatingSystem.LastBootUpTime
lastBootTime = CDate(Mid(lastBootTime, ...

som:

lastBootTimeStr = objOperatingSystem.LastBootUpTime
lastBootTimeDate = CDate(Mid(lastBootTimeStr, ...

eller:

strLastBootTimeStr = objOperatingSystem.LastBootUpTime
dateLastBootTimeDate = CDate(Mid(strLastBootTime, ...

gøre det nemmere at læse.
Avatar billede boholdt Mester
14. juli 2023 - 22:36 #12
Hej igen, og tak for svarene.

Det er fornemt, at eksperterne stiller sig til rådighed.

Jeg har nu eksperimenteret en hel del, og fundet en løsning der fungerer.

Den er følgende i ren ASP-kode:
<%@ Language=VBScript %>
<%
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
   
    For Each objOperatingSystem in colOperatingSystems
        lastBootTime = objOperatingSystem.LastBootUpTime
        lastBootTime = WMIDateStringToDate(lastBootTime)
       
        ' Konverter månedtallet til månedsnavn på dansk
        monthNumber = Month(lastBootTime)
        monthNameValue = GetDanishMonthName(monthNumber)
       
        Response.Write("Serveren blev sidst genstartet den " & Day(lastBootTime) & ". " & monthNameValue & " " & Year(lastBootTime) & " klokken " & TimeValue(lastBootTime))
   
    Next
   
    ' Hjælpefunktion til konvertering af dato fra WMI-format til VBScript-datoformat
    Function WMIDateStringToDate(wmiDate)
        WMIDateStringToDate = CDate(Mid(wmiDate, 7, 2) & "/" & Mid(wmiDate, 5, 2) & "/" & Left(wmiDate, 4) & " " & Mid(wmiDate, 9, 2) & ":" & Mid(wmiDate, 11, 2) & ":" & Mid(wmiDate, 13, 2))
    End Function
   
    ' Hjælpefunktion til at få det danske månedsnavn baseret på månedens nummer
    Function GetDanishMonthName(monthNumber)
        Dim monthNames
        monthNames = Array("januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december")
        GetDanishMonthName = monthNames(monthNumber - 1)
    End Function
%>
---
Rigtig god dag til alle.

Mvh Anders
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester