Loading
Salesforce-organisaatiosi määrittäminen ja ylläpito
Esimerkkikoodi paikkamäärityksen mukaan muotoilluista tiedoista

Esimerkkikoodi paikkamäärityksen mukaan muotoilluista tiedoista

Tutustu esimerkkeihin koodista, joka käsittelee tietoja, jotka voidaan muotoilla käyttäjän paikkamäärityksen perusteella. Katso, miten koodi voi rikkoutua, kun se luottaa päivämäärien, kellonaikojen ja valuuttojen olevan tietyssä muodossa. Tutustu myös esimerkkeihin siitä, miten voit ratkaista nämä ongelmat käyttämällä tämäntyyppisten tietojen käsittelemiseen tarkoitettuja standardimetodeja.

Vaaditut versiot

Käytettävissä: Salesforce Classicissa ja Lightning Experiencessa
Käytettävissä: Kaikissa versioissa

Valuuttojen, päivämäärien, kellonaikojen, päivämäärä/aika-arvojen, kokonaislukujen, nimien ja osoitteiden formaatit voivat muuttua, kun käyttäjä muuttaa paikkamääritystä. Kun otat International Components for Unicode (ICU) -paikkamääritysformaatit käyttöön, joidenkin paikkamääritysten päivämäärien, kellonaikojen, päivämäärä/aika-arvojen, kokonaislukujen ja valuuttojen formaatit muuttuvat.

Katsotaanpa joitakin koodiesimerkkejä, jotka käsittelevät näitä datatyyppejä, sekä virheitä, joita saattaa ilmetä, jos emme käytä koodissa paikkamääritysneutraaleja metodeja.

Päivämäärän komponenttien noutaminen

Tässä esimerkissä haluamme vahvistaa päivämäärän: 12. lokakuuta 2021. Pidämme tämän esimerkin yksinkertaisena näyttämällä prosessista vain osan, jossa koodi vahvistaa kuukausi-, päivä- ja vuosiarvot. Kuukausiarvo voi olla enintään 12. Päiväarvo voi olla enintään 31. Vuosiarvon täytyy sisältää tarkalleen 4 numeroa. Vain päivämäärät, jotka läpäisevät kaikki nämä kolme testiä, noudetaan asiaankuuluviin arvoihin lisäkäsittelyä varten.

Alla on esimerkki, joka käyttää Apexin Pattern- ja Matching-luokkia päivämäärän määrittämiseen. Kuvion täsmäyksessä oletetaan, että päivämääräformaatti on kk/pp/vvvv.

Date myDate = Date.newInstance(2021, 10, 20);
String formattedDate = myDate.format();
 
//Simple regex not having all validations for days in months nor accounting for leap year
Pattern datePattern = Pattern.compile('(0?[1-9]|1[0-2])\\/(0?[1-9]|[2][0-9]|3[01])\\/([0-9]{4})');
Matcher matcher = datePattern.matcher(formattedDate);
 
if(matcher.matches()) {
   Integer day = Integer.valueOf((matcher.group(1))); //10
   Integer month = Integer.valueOf((matcher.group(2))); //20
   Integer year = Integer.valueOf((matcher.group(3))); //2021
   // Further validation logic for max days in month/ leap year and post processing
}

Apex-koodi muotoilee päivämäärän kontekstikäyttäjän paikkamäärityksen perusteella. Tässä esimerkissä kontekstikäyttäjä on valinnut paikkamäärityksen Espanja (Yhdysvallat) [es_US].

Kun ICU-paikkamääritysformaatit ovat käytössä, Tämä vahvistus epäonnistuu. Käyttäjän paikkamäärityksen ICU-formaatti on eri kuin vastaava Oraclen Java Development Kit (JDK) -formaatti.

  • Päivämäärien lyhyt JDK-formaatti en_US-paikkamääritykselle: 10/20/2021
  • Päivämäärien lyhyt ICU-formaatti en_US-paikkamääritykselle: 20/10/2021

Apex Date -luokan format()-metodi palauttaa päivämäärän merkkijonona käyttämällä kontekstikäyttäjän paikkamääritystä. Tässä tapauksessa se palauttaa 20/10/2021, koska ICU-paikkamääritysformaatit ovat käytössä ja käyttäjän paikkamääritys on es_US.

Sen jälkeen koodi käyttää päivämäärätulosta kohdistaakseen kuukausi-, päivä- ja vuosiarvot, olettaen tuloksen olevan muodossa kk/pp/vvvv. Koodi kohdistaa siis kuukaudeksi 20, ja koska 20 on suurempi kuin 12, kuvion täsmäys määrittää tämän päivämäärän olevan virheellinen, mikä ei pidä paikkansa.

Voit välttyä näiltä ongelmilta käyttämällä sisäänrakennettuja Apex-metodeja vaadittujen arvojen noutamiseen. Tässä tapauksessa month(), day() ja year().

Alla on esimerkki näiden metodien käytöstä kuukausi-, päivä- ja vuosiarvojen määrittämiseksi.

Date myDate = Date.newInstance(2021, 10, 20);

// assign month, day, and year values for validation
Integer month = myDate.month(); //10
Integer day = myDate.day(); //20
Integer year = myDate.year(); //2021

// Further validation logic

Päivämäärä/aika-arvon vahvistaminen

Tämä Apex-esimerkki käyttää Datetime.parse-metodia luodakseen päivämäärä/aika-arvon merkkijonosta. Välitetty arvo vastaa JDK-paikkamääritysformaattia Englanti (Yhdysvallat) [en_US].

Tämä vahvistus epäonnistuu, kun ICU-paikkamääritysformaatit ovat käytössä, koska en_US-paikkamäärityksen päivämäärä/aika-formaatti on erilainen JDK:ssa ja ICU:ssa. ICU-formaatti sisältää pilkun päivämäärän jälkeen.

  • Päivämäärä/aika-arvojen JDK-formaatti en_US-paikkamääritykselle: 10/14/2011 11:46 AM
  • Päivämäärä/aika-arvojen ICU-formaatti en_US-paikkamääritykselle: 10/14/2011, 11:46 AM
Datetime dt = DateTime.parse('10/14/2011 11:46 AM');
String myDtString = dt.format();
system.assertEquals(myDtString, '10/14/2011, 11:46 AM');

Korjaa tämä ongelma päivittämällä ICU-paikkamääritysformaattiin välitetty arvo. Jos ulkoinen järjestelmä välittää arvon, ota yhteyttä lähettäjään päivittääksesi lähdetietojen muodon. Pyydä lähettäjää lähettämään päivämäärä paikkamääritysneutraalissa muodossa aina, kun se on mahdollista. Formaattien päivitykset kannattaa käsitellä tällä tavalla, koska paikkamääritysneutraalit formaatit eivät vaadi koodisi päivittämistä, kun formaatti muuttuu.

Lähettäjä ei voi kuitenkaan aina päivittää organisaatioosi välitettyjen tietojen formaattia. Jos näin tapahtuu, voit muotoilla lähetettävien tietojen formaatin uudelleen, koska tiedät formaatin. Muunna tiedot tällöin paikkamääritysneutraaliin muotoon.

Alla on kaksi yleistä metodia, joita käytetään päivämäärän/aika-arvojen muotoilemiseen Apexissa. Näiden molempien metodien tuloksena oleva päivämäärä/aika on paikkamääritysneutraali: se näytetään käyttäjän valitsemassa paikkamäärityksessä. Lisätietoja kaikille formaateille käytettävissä olevista metodeista on Apex-viiteoppaassa.

  • Nouda päivämääräkomponentit erillisiin parametreihin: vuosi, kuukausi, päivä, tunnit, minuutit ja sekunnit. Luo sitten paikkamääritysneutraali päivämäärä käyttämällä Apex-luokan Datetime DateTime.newInstanceGMT()-metodia.
    //Before using the code below, set the year, month, day, hour, minutes, and seconds components 
    //by extracting values from the passed date and complete any necessary validation
    
    //set the datetime value by passing the parameters 
    DateTime myDt = DateTime.newInstanceGMT(year, month, day, hour, minutes, seconds);
    
  • Muotoile välitetyt tiedot vakiomuotoiseen päivämäärämuotoon yyyy-MM-dd HH:mm:ss paikkamäärityksen aikavyöhykkeen mukaan. Luo sitten paikkamääritysneutraali päivämäärä käyttämällä Datetime-luokan valueOf(String dateTimeString)-metodia.
    //Before using the code below, convert the passed datetime data to a string in the format yyyy-MM-dd HH:mm:ss 
    //and assign that value to the stringDate parameter
    
    //set the datetime value by passing the string 
    DateTime myDt = date.valueOf(stringDate);
    

Tämä formaattien muunnos toimii, kunhan organisaatioosi välitettyjen tietojen muoto ei muutu. Jos ulkoinen lähteesi päivittää käyttämänsä formaatin, sinun täytyy päivittää metodit, joita käytät tietojen keräämiseen tai muuntamiseen.

Ajan välittäminen ulkoiseen järjestelmään

Tässä yksinkertaisessa esimerkissä tapahtuma tapahtuu 18. marraskuuta 2021 klo 15.30 GMT. Haluamme välittää päivämäärän ja kellonajan erillisinä arvoina ulkoiseen järjestelmään.

//create Datetime to pass externally in GMT
DateTime event1_dt = DateTime.newInstanceGMT(2021, 11, 18, 15, 30, 0);

//split into event date and event time for external system
Date event1_date = event1_dt.date();
Time event1_time = event1_dt.time(); 

Tämä koodi toimii, jos ulkoinen järjestelmä odottaa päivämäärän ja kellonajan olevan neutraalissa muodossa. Mutta entä jos ulkoinen järjestelmä tarvitsee tapahtuman päivämäärän ja kellonajan tietyssä muodossa? Oletetaan, että ulkoinen järjestelmä olettaa päivämäärän ja kellonajan olevan seuraavissa muodoissa: 18/11/2021 ja 3:30 PM.

Jos haluat soveltaa odotettuja formaatteja tapahtuman päivämäärään ja kellonaikaan, käytä Datetime-metodiaformat().

//create Datetime to pass externally
DateTime event1_dt = DateTime.newInstance(2021, 11, 18, 15, 30, 0);

//split into event date and event time for external system, applying expected format
String event1_date = event1_dt.format('dd/MM/yyyy');
String event1_time = event1_dt.format('h:mm a');
 
Ladataan
Salesforce Help | Article