Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Päivämäärän tunnistus eri muodoissa

dazwee [11.10.2013 11:47:37]

#

Moi,

Luen input tiedostosta alla olevalla koodilla päivämäärän pickeriin.

datetimepicker_date.Value = CType(sr.ReadLine(), Date)

Toimii hienosti kun avaan omia tekemiä tiedostoja. Mutta kun avaan kiinan maa asetuksilla tehtyjä tiedostoja. Tulee error ei osaa castata, muoto väärä!

Miten voisin castata tuon niin että päivämäärä voi olla minkä tahansa maa-asetuksen mukainen ja se kääntää sen omalle maa-asetukselle sopivaksi?

Input tiedostossa ei ole tietoa millä maa asetuksilla tehty, joten se pitää arvata jotenkin päiväämärän muodosta.

Teuro [11.10.2013 14:28:23]

#

Entä jos pakottaisit standardin mukaiseen merkintään? Olisi helpompi elää, kun data tulee strukturoidussa muodossa sisään. Toinen vaihtoehto on lisätä sopiva metadata datan muodosta. Miten esimerkiksi tulkitset päivämäärän "2013-03-04 12:00:50" vs "3.4.2013 12:00:50" tai ehkä joku haluaa ilmaista sen näin "4.3.2013 12:00:50" Et voi siis pelkän datan perusteella päätellä muodosta täysin varmaksi haluttua aikaleimaa.

dazwee [11.10.2013 15:22:26]

#

Isoin ongelma on siinä että tuo päivämäärä on tehty tyhmästi alunperin.
Nyt kuitenkin laskentoja on tehty ja ne vanhatkin pitäisi saada auki.

Alla olevalla saa castattua mutta ainakin UK ja US menevät väärin

'                                   kiina                   intia                   uk                      us                      turkki                  suomi
Dim dateStrings() As String = {"2013/10/11 14:37:00", "11-10-2013 14:35:55", "10/11/2013 2:37:40 PM", "10/11/2013 2:40:02 PM", "11.10.2013 14:41:27", "30.9.2013 14:46:25"}
Dim dateValue As Date

Console.WriteLine("Attempting to parse strings using {0} culture.", _
                  CultureInfo.CurrentCulture.Name)
For Each dateString As String In dateStrings
    If Date.TryParse(dateString, dateValue) Then
        Console.WriteLine("  Converted '{0}' to {1} ({2}).", dateString, _
                          dateValue, dateValue.Kind)
    Else
        Console.WriteLine("  Unable to parse '{0}'.", dateString)
    End If
Next
Console.Read()

'Attempting to parse strings using fi-FI culture.
'Converted() '2013/10/11 14:37:00' to 11.10.2013 14:37:00 (Unspecified).
'Converted() '11-10-2013 14:35:55' to 11.10.2013 14:35:55 (Unspecified).
'Converted() '10/11/2013 2:37:40 PM' to 10.11.2013 14:37:40 (Unspecified).
'Converted() '10/11/2013 2:40:02 PM' to 10.11.2013 14:40:02 (Unspecified).
'Converted() '11.10.2013 14:41:27' to 11.10.2013 14:41:27 (Unspecified).
'Converted() '30.9.2013 14:46:25' to 30.9.2013 14:46:25 (Unspecified).

Lisäys:

Alkuperäisiin tiedostoihin tulee päivämäärä DateTimePickerin kautta joten päivämäärät ovat sentään jossain vakio muodossa. Kuten yllä olevassa esimerkissä.
Pystyisinkö lukemaan .txt input filestä muutospäivämäärän, se luultavasti olisi automaattisesti aina maa kohtainen?

Päivämäärän ainoa tarkoitus on näyttää koska laskenta on talennettu.

Teuro [11.10.2013 15:42:29]

#

Pystyykö tiedoston nimestä tekemään päätelmiä missä maassa kyseinen tiedosto on tuotettu? Mikäli näin on voidaan ohjelmaan luoda säännöt eri maille lukemisen tueksi. Luetaanko vanhoja datoja useinkin, eli olisiko järkevää konvertoida ensin kaikki datat vakiomuotoon?

Jatkon kannalta data johonkin vakioituun muotoon ja aikaleimat UTC-aikaan, jolloin aikavyöhyke ja mahdolliset talvi- ja kesäajat eivät sotke laskuja.

http://www.codeproject.com/Articles/11201/FileTime-Getting-and-setting-the-file-time-in-NET:

Dim fileName As String = "C:\MyPath\MyFile.txt"
    If File.Exists(fileName) Then
        Label_CreationTime.Text =
                 File.GetCreationTime(fileName).ToString
        Label_LastAccess.Text =
                 File.GetLastAccessTime(fileName).ToString
        Label_LastWrite.Text =
                 File.GetLastWriteTime(fileName).ToString
    End If

ajv [12.10.2013 09:28:19]

#

Olen myös tuon oppinut kantapään kautta, että ei kannata käyttää tallennuksessa

datetime.ToString()

silloin tosiaan menee siinä muodossa, mihinkä maahan kone on lokalisoitu. Tämä tuntuu toimivan globaalisti:

datetime.ToString(CultureInfo.InvariantCulture)

(löytyiköhän tuo CultureInfo nyt System.Globalization nimiavaruudesta)

Sama homma tulee vastaan myös reaalilukujen kanssa. Suomessa tuppaa tulemaan pilkku erottimeksi, joka ei esimerkiksi Kiinassa toimi :) Itseasiassa juuri tämän opin kantapään kautta, päivämäärät ja ajat tulee aina laitettua automaattisesti "standardiin formaattiin"

dazwee [12.10.2013 11:15:40]

#

Jep, onneksi tuon pilkun ja pisteen tajusin hoitaa heti alusta asti, mutta kun päivämäärällä ollut mitään järkevää toimintoa se jäi hieman toissijaiseksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta