Pieniä kysymyksiä ohjelmoinnista

Liittynyt
23.11.2018
Viestejä
16
DarryIG avasikin stackoverflowssa noita ongelmia tuossa (mutta ymmärsin, että kaipaat hieman lisää selkokieltä?).

Olettaen, että nuo a ja b ovat tosiaan erilliset tapaukset, niin sinun tulisi testata ne erikseen, nyt lisäilet 'osumia' s.e. molemmat variaatiot ovat mukana. Eli tarkista_osuuko_kuningatar tms suattaisi olla hyvä ajatus. (ruutupaperilla tai excelillä mietit miten kuningatar liikkuu... Yksi suunta +1 molempiin akseleihin, toinen +1, - 1 jne.)

Lisäksi huomio siitä, että voit keksiä paikat ottamalla yhden 64:sta kolumni-rivi-parista ja sitten seuraavan jäljelle jäävistä 63:sta ratkaisee tuon arpomisongelman.
Selkokieltä kaipaisin ja mielellään selkeää koodinpätkääkin. Sen verran aloittelija vielä, että en kovin helposti saa ajatuksia muunnettua koodiksi.
Tavallaan nuo kaksi tapausta (torni & kuningatar) voi nähdä yhtenä tapauksena, koska kuningattaren liikkeet ovat samat kuin tornin, mutta lisäyksenä ristisuunnassa liikkumiset. Eli tavallaan tuon tornin voi tästä ajatusleikistä jättää pois.

Miten tuon kuningattaren liikkeen saisi toteutettua kunnolla? Seinä voi akselilla tulla vastaan heti tai vasta monen ruudun päästä.
 
Liittynyt
17.10.2016
Viestejä
3 115
Selkokieltä kaipaisin ja mielellään selkeää koodinpätkääkin. Sen verran aloittelija vielä, että en kovin helposti saa ajatuksia muunnettua koodiksi.
Tavallaan nuo kaksi tapausta (torni & kuningatar) voi nähdä yhtenä tapauksena, koska kuningattaren liikkeet ovat samat kuin tornin, mutta lisäyksenä ristisuunnassa liikkumiset. Eli tavallaan tuon tornin voi tästä ajatusleikistä jättää pois.

Miten tuon kuningattaren liikkeen saisi toteutettua kunnolla? Seinä voi akselilla tulla vastaan heti tai vasta monen ruudun päästä.
Minkä koulun tehtäviä nää on?

Tosiaan sille diagonaaliliikkumisellehan ehtona on se, että rivi-indeksien ja kolumni-indeksien erotuksen pitää olla sama. Siitä saat ehdon tuonne if-lausekkeeseesi.
 
Liittynyt
23.11.2018
Viestejä
16
Minkä koulun tehtäviä nää on?

Tosiaan sille diagonaaliliikkumisellehan ehtona on se, että rivi-indeksien ja kolumni-indeksien erotuksen pitää olla sama. Siitä saat ehdon tuonne if-lausekkeeseesi.
En mielelläni paljasta opinahjoa, mutta kuten huomaat on materiaali sekä ikivanhaa että todella huonoa valmentamaan tehtävien ratkaisuun, etenkin tällaista keltanokkaa.

Eli toimisiko tuolle diagonaaliliikkumiselle ao. koodinpätkä?

Koodi:
 elif white_column==black_column or white_row==black_row or white_column-black_column==white_row-black_row:
        hot=hot+1
        #checks if queen can attack
 
Liittynyt
17.10.2016
Viestejä
3 115
En mielelläni paljasta opinahjoa, mutta kuten huomaat on materiaali sekä ikivanhaa että todella huonoa valmentamaan tehtävien ratkaisuun, etenkin tällaista keltanokkaa.

Eli toimisiko tuolle diagonaaliliikkumiselle ao. koodinpätkä?

Koodi:
 elif white_column==black_column or white_row==black_row or white_column-black_column==white_row-black_row:
        hot=hot+1
        #checks if queen can attack
En mä nyt tiedä onko sillä vanhuudella mitään väliä. Ihan täsmälleen samalla tavalla tuo homma toimii edelleen Python 3 puolellakin. Ja täsmälleen samaa loogista ajattelua tarvii harrastaa sielläkin.

Mutta niin, nythän tuo erotus kattaa vain tapaukset joissa rivi-indeksi ja kolumni-indeksi kasvaa tai pienenee siirryttäessä nappulasta toiseen. Mitenkäs saisit sen ottamaan huomioon tilanteet missä rivi-indeksi kasvaa mutta kolumni-indeksi pienenee, tai toisinpäin?
 
Liittynyt
23.10.2016
Viestejä
485
Käytän yhdessä projektissa Google Sheetsiä tietokantana. Google Sheets -autentikoimista varten mulla on Googlelta saatu .json tiedosto, jossa on kymmenkunta kenttää. Tuota tiedostoa en voi tietenkään pushata GitHubiin muiden nähtäville, mutta tarvitsen tuota GitHubin CI-putkessa ja production serverillä, jonne pushaan GitHubista automaattisesti.

Koitin piilottaa salaiset tiedot ympäristömuuttujiin ja käyttää Javascript-objektia jsonin sijaan, mutta näyttää siltä, että sen pitää nimenomaan olla json. Miten tuota kuuluisi käsitellä?
 
Liittynyt
17.10.2016
Viestejä
3 115
Käytän yhdessä projektissa Google Sheetsiä tietokantana. Google Sheets -autentikoimista varten mulla on Googlelta saatu .json tiedosto, jossa on kymmenkunta kenttää. Tuota tiedostoa en voi tietenkään pushata GitHubiin muiden nähtäville, mutta tarvitsen tuota GitHubin CI-putkessa ja production serverillä, jonne pushaan GitHubista automaattisesti.

Koitin piilottaa salaiset tiedot ympäristömuuttujiin ja käyttää Javascript-objektia jsonin sijaan, mutta näyttää siltä, että sen pitää nimenomaan olla json. Miten tuota kuuluisi käsitellä?
GitHubin Secrets olisi yksi vaihtoehto säilöä tuollaisia.

Mutta siis, Google Sheets tietokantana? :eek:

Mutta itse siihen jsoniin, niin mikä sulla sitä jsonia lukee ja mitä kenttiä se sieltä tarvii?
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
4 857
Koitin piilottaa salaiset tiedot ympäristömuuttujiin ja käyttää Javascript-objektia jsonin sijaan, mutta näyttää siltä, että sen pitää nimenomaan olla json. Miten tuota kuuluisi käsitellä?
Luulisi, että ohjeissa on kerrottu, mitä se sun autentikoija haluaa: stringin (json) vai objektin. Json on siis esitysmuoto, jolla sen objektin saa tekstimuotoon. Minne siis tunget sitä?
 
Liittynyt
23.10.2016
Viestejä
485
GitHubin Secrets olisi yksi vaihtoehto säilöä tuollaisia.

Mutta siis, Google Sheets tietokantana? :eek:

Mutta itse siihen jsoniin, niin mikä sulla sitä jsonia lukee ja mitä kenttiä se sieltä tarvii?
Joo, GitHub secrets on tuttu. Mun pitäis vaan ensin saada toimimaan autentikointi ympäristömuuttujien kanssa ton json-tiedoston sijaan.

Ei takerruta Google Sheetsiin. Tähän tarkoitukseen aivan passeli. :)

Käytän tätä kirjastoa. Tässä oma koodi:

JavaScript:
export const getDocument = async () => {
  const doc = new GoogleSpreadsheet(config.GS_ID);
  await doc.useServiceAccountAuth(config.GS_AUTH);
  await doc.loadInfo();
  return doc;
};
config.GS_AUTH on siis se JSON.

Tuolla dokumentaatiossa lukee, että JS-objektia voisi käyttää autentikointiin näin:
JavaScript:
await doc.useServiceAccountAuth({
  client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  private_key: process.env.GOOGLE_PRIVATE_KEY,
});
Jostain syystä en saa autentikointia toimimaan muuten kuin JSON-filulla.

EDIT:

Ton kirjaston lähdekoodissa toi useServiceAuth-metodi on seuraavanlainen:
JavaScript:
  // creds should be an object obtained by loading the json file google gives you
  async useServiceAccountAuth(creds) {
    this.jwtClient = new JWT({
      email: creds.client_email,
      key: creds.private_key,
      scopes: GOOGLE_AUTH_SCOPES,
    });
    await this.renewJwtAuth();
  }
Eli siis vain client_emailia ja private_keytä kaipaa. En ymmärrä miksei tuo toimi js-objektilla. Virheilmoitus on:
Error: error:0906D06C:pEM routines:pEM_read_bio:no start line

Olen copy-pastettanut tiedot suoraan jsonista .enviin.
 
Viimeksi muokattu:
Liittynyt
16.10.2016
Viestejä
449
Joo, GitHub secrets on tuttu. Mun pitäis vaan ensin saada toimimaan autentikointi ympäristömuuttujien kanssa ton json-tiedoston sijaan.

Ei takerruta Google Sheetsiin. Tähän tarkoitukseen aivan passeli. :)

Käytän tätä kirjastoa. Tässä oma koodi:

JavaScript:
export const getDocument = async () => {
  const doc = new GoogleSpreadsheet(config.GS_ID);
  await doc.useServiceAccountAuth(config.GS_AUTH);
  await doc.loadInfo();
  return doc;
};
config.GS_AUTH on siis se JSON.

Tuolla dokumentaatiossa lukee, että JS-objektia voisi käyttää autentikointiin näin:
JavaScript:
await doc.useServiceAccountAuth({
  client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  private_key: process.env.GOOGLE_PRIVATE_KEY,
});
Jostain syystä en saa autentikointia toimimaan muuten kuin JSON-filulla.

EDIT:

Ton kirjaston lähdekoodissa toi useServiceAuth-metodi on seuraavanlainen:
JavaScript:
  // creds should be an object obtained by loading the json file google gives you
  async useServiceAccountAuth(creds) {
    this.jwtClient = new JWT({
      email: creds.client_email,
      key: creds.private_key,
      scopes: GOOGLE_AUTH_SCOPES,
    });
    await this.renewJwtAuth();
  }
Eli siis vain client_emailia ja private_keytä kaipaa. En ymmärrä miksei tuo toimi js-objektilla. Virheilmoitus on:
Error: error:0906D06C:pEM routines:pEM_read_bio:no start line

Olen copy-pastettanut tiedot suoraan jsonista .enviin.
Laitat suoraan kahteen eri ympäristömuuttujiin email ja private key ja luet ne stringinä tolle auth metodille.

JavaScript:
// or preferably, loading that info from env vars / config instead of the file
await doc.useServiceAccountAuth({
  client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  private_key: process.env.GOOGLE_PRIVATE_KEY,
});
 
Liittynyt
23.10.2016
Viestejä
485
Laitat suoraan kahteen eri ympäristömuuttujiin email ja private key ja luet ne stringinä tolle auth metodille.

JavaScript:
// or preferably, loading that info from env vars / config instead of the file
await doc.useServiceAccountAuth({
  client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
  private_key: process.env.GOOGLE_PRIVATE_KEY,
});
Tuota jo koitin. Ei toimi.

Huvikseni koitin laittaa email ja private_key -stringit suoraan tohon ilman ympäristömuuttujia niin sillein toimii. Jos laitan pelkästään emailin ympäristömuuttujan ja suoraan stringinä niin silleinkin toimii. Jotenkin se private_key menee rikki jos sen laittaa ympäristömuuttujaan.
 
Liittynyt
23.10.2016
Viestejä
989
Huvikseni koitin laittaa email ja private_key -stringit suoraan tohon ilman ympäristömuuttujia niin sillein toimii. Jos laitan pelkästään emailin ympäristömuuttujan ja suoraan stringinä niin silleinkin toimii. Jotenkin se private_key menee rikki jos sen laittaa ympäristömuuttujaan.
Auttaisiko, jos ottaisit käyttöön dotenv kirjaston noiden ympäristömuuttujien parsintaan, ja pistäisi ympäristömuuttuja .env -tiedostoon? Voi olla, että perusparseri käsittelee tuon privatekeyn jotenkin väärin. Ainahan voit myös logittaa sen private_keyn, ja katsoa täsmääkö se siihen mihin pitäisi.
 
Liittynyt
17.10.2016
Viestejä
4 857
Tuota jo koitin. Ei toimi.

Huvikseni koitin laittaa email ja private_key -stringit suoraan tohon ilman ympäristömuuttujia niin sillein toimii. Jos laitan pelkästään emailin ympäristömuuttujan ja suoraan stringinä niin silleinkin toimii. Jotenkin se private_key menee rikki jos sen laittaa ympäristömuuttujaan.
Tulosta sen private_keyn sisältö ja katso, näyttääkö oikealta? Tee === vertailu, jossa vertaat sen ympäristömuttujan sisältöä literaaliin? Tuleeko yhtäsuuruus?
 
Liittynyt
23.10.2016
Viestejä
485
Auttaisiko, jos ottaisit käyttöön dotenv kirjaston noiden ympäristömuuttujien parsintaan, ja pistäisi ympäristömuuttuja .env -tiedostoon? Voi olla, että perusparseri käsittelee tuon privatekeyn jotenkin väärin. Ainahan voit myös logittaa sen private_keyn, ja katsoa täsmääkö se siihen mihin pitäisi.
Dotenv on käytössä.
Tulosta sen private_keyn sisältö ja katso, näyttääkö oikealta? Tee === vertailu, jossa vertaat sen ympäristömuttujan sisältöä literaaliin? Tuleeko yhtäsuuruus?
No niin. Nyt aukesi sen verran, että newlinet (\n) eivät tule oikein tuolta ympäristömuuttujasta. Kun tulosta tavalliseen muuttujaan tallennetun avaimen, niin se tulostuu oikein rivinvaihtoineen päivineen, mutta tuo ympäristömuuttujassa oleva avain ei. Siinä tulostuu itsessään ne rivinvaihtomerkit rivinvaihtojen sijaan.

Olin noita jo tulostellut yksi kerrallaan ja molemmat näytti oikeilta, mutta nyt samanaikaisesti tulostaessa huomasin eron.

dotenv ei vissiin tue multilineä (issue). Sain kuitenkin homman toimimaan tällä hackilla:

JavaScript:
const GS_PRIVATE_KEY = process.env.GS_PRIVATE_KEY.split("\\n").join("\n");
 
Liittynyt
17.10.2016
Viestejä
4 857
@Nigel, miksi siellä avaimessa on edes rivinvaihtoja? Kuulostaa vähän hassulta ja aiheuttanee lähinnä ongelmia,
 
Liittynyt
08.11.2018
Viestejä
335
Mulla on työnpuolesta käytössä Excel-taulukko jossa on linkkejä PDF-tiedostoihin. Linkit viittaa kuitenkin pääurakoijan verkossa oleviin tiedostoihin.

Ko. tiedostot on mulla olemassa, mutta pystyykö ne jollain tavalla "automaagisesti" kerralla muuttamaan että \\pääurakoitsija\kansio\kansio\tiedosto1.pdf --> \\omadrive\kansio\tiedosto1.pdf ??

Rivejä kuitenkin parisen sataa + taulukosta tulee aina silloin tällöin uusi versio käyttöön, niin käsin manuaalisesti muuttamiseen menee liikaa aikaa.

Tosin taulukko on suojattu, mutta omien kokemuksien mukaan sen murtamiseen ei kauaa aikaa mene?!? Ellei Microsoft ole jotain muuttanut viimeaikoina.

Edit: ctrl+f "Etsi ja korvaa" ei toimi. Koska tiedostonimet näyttääkin olevan tyyliin "Tiedosto%1%2joku%2nimi" jne jne.
 
Viimeksi muokattu:
Liittynyt
02.12.2017
Viestejä
88
Jatketaampa typeriä kysymyksiä vol n+1.

Voiko C#:ssä interface periä pääluokalta.

Esim tässä jos haluaisin lisätä IVechile rajapinnan yläpuolelle 'tehtaan' pääluokaksi.

pääluokka: tehdas
interface: ajoneuvo
alaluokat: ajoneuvotyypit

Koodi:
public class Factory

Koodi:
public interface IVehicle
{
 
}
public class Unicycle : IVehicle
{
       
}
public class Car : IVehicle
{
       
}
public class Motorbike : IVehicle
{
           
}
public class Truck : IVehicle
{
     
}



Koodi:
public class Factory
{.....
....
}
public interface IVehicle : Factory  //Miten tämä  pitäisi määritellä, kun tälläinen ei käsittäkseni toimi.
Jos ylipäänsä mahdollista?
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
1 750
Ei kai missään kielessä interface voi olla alaluokka kun siinä ei voi olla implementaatiota.
Ja muutenkaan en ymmärrä tuota esimerkkiä semanttisessa mielessä kun eihän ajoneuvo ole mikään tehtaan alatyyppi.
 
Liittynyt
17.10.2016
Viestejä
1 750
No kuten sanoin, rajapinta ei voi periä luokkaa kun luokassa on ilmpelentaatiota.

Eikä tuokaan esimerkki ole hyvä koska loogisesti ajateltuna ajoneuvomerkki on ajoneuvon ominaisuus, eli yläluokka.

Miksi haluat tehdä näin? Miksei se pääluokka voi myös olla rajapinta?
 
Liittynyt
02.12.2017
Viestejä
88
No jos haluan luoda objekteja pääluokkaan perustuen (useampi merkki). Lähdin tätä miettimään ihan siksi, kun luin ettei C:ssä luokat voi periä kuin polvelta toiselle, (parent - child).
 
Liittynyt
19.10.2016
Viestejä
1 245
Jos haluat tehtaan, se arvatenkin tuottaa ajoneuvoja eikä ole ajoneuvo (esim. Car) tai mikään ajoneuvon kaltainen (IVehicle). Toisin sanottuna todennäköisesti haluat tehtaalle metodin, jonka paluuarvona on tahtotilasta riippuen yksi tai useampi ajoneuvo. Näin ollen tehtaan on syytä olla luokka, joka itsessään ei ole minkäänlaisessa yhteydessä ajoneuvoihin vaan sillä on vain metodi, joka tuotaa ajoneuvoja. Tosin tämä on vain arvaus siitä, mitä haluat tehdä.

Muutenkin C#:ssa rajapinta on vain kuvaus siitä, mitä jokin rajapinnan toteuttava luokka osaa tehdä. Se ei siis sisällä minkäänlaista toteutusta (paitsi jossain uudemmassa versiossa voi sisältää, mutta ellet tiedä, miksi yleensä rajapinnan ei haluta tarjoavan toteutusta, et varmasti myöskään halua sellaista tehdä ellet tykkää ampua omaan jalkaasi).
 
Liittynyt
02.12.2017
Viestejä
88
Kiitos Xiyng: Viititkö viellä selventää mitä tuo luokkien periytyminen tarkoittaa käytännössä. Olen lukenut siitä, mutta todennäköisesti ymmärtänyt sen väärin, siksi lähdin sooloilemaan. Jos kerran luokkia ei voi ketjuttaa kahta luokkaa enempää, niin miten toteutetaan esim. projektinhallintaohjelma jossa yksi Projekti koostuisi useasta Miniprojektista, jotka taas koostuisi useista tehtävistä.

Projekti
MP MP MP
T T T T T T T T T T T

Olisin kuvitellut, että siinä tarvittaisiin kolme eri luokkaa, joiden perusteella objekteja luotaisiin, mutta ongelmana on periytyminen, eli kuinka Tehtävä objektit saa Projektin tiedot jos kerran luokat ei periydy niin pitkälle vaan ainoastaan (MP : P) ja (T : MP), mutta ei (T : MP : P) tai (T : P)

Eli onko rajapinnan käyttämisestä jotain apua vai vaan se etten ole ymmärtänyt mitä tämä periytyminen tarkoittaa?
 
Liittynyt
19.10.2016
Viestejä
727
Kiitos Xiyng: Viititkö viellä selventää mitä tuo luokkien periytyminen tarkoittaa käytännössä. Olen lukenut siitä, mutta todennäköisesti ymmärtänyt sen väärin, siksi lähdin sooloilemaan. Jos kerran luokkia ei voi ketjuttaa kahta luokkaa enempää, niin miten toteutetaan esim. projektinhallintaohjelma jossa yksi Projekti koostuisi useasta Miniprojektista, jotka taas koostuisi useista tehtävistä.

Projekti
MP MP MP
T T T T T T T T T T T

Olisin kuvitellut, että siinä tarvittaisiin kolme eri luokkaa, joiden perusteella objekteja luotaisiin, mutta ongelmana on periytyminen, eli kuinka Tehtävä objektit saa Projektin tiedot jos kerran luokat ei periydy niin pitkälle vaan ainoastaan (MP : P) ja (T : MP), mutta ei (T : MP : P) tai (T : P)

Eli onko rajapinnan käyttämisestä jotain apua vai vaan se etten ole ymmärtänyt mitä tämä periytyminen tarkoittaa?
Sanoisin, että tuossa tehtävä ei ole projekti, eli ei periydy ollenkaan projektista. Sen sijaan projekti voisi sisältää (esimerkiksi) listan tehtävistä, joka aivan oma luokkansa.

Eli näyttää siltä, että olet ajatellut periytymisen kuvaavan koostetta ('jokin koostuu joistakin jutuista')? Periytyminen ennemminkin tarkentaa tyyppiä (ehkä huono selitys), esim. Työntekijästä voisi periyttää vakituisen ja määräaikaisen, kumpiakin voi käsitellä työntekijöinä, mutta niillä omia tietoja/toteutuksia, jotka poikkeavat toisistaan. Siinä olet oikeassa, että esimerkissä työntekijä voisi olla interface.
 
Liittynyt
19.10.2016
Viestejä
1 245
Kiitos Xiyng: Viititkö viellä selventää mitä tuo luokkien periytyminen tarkoittaa käytännössä. Olen lukenut siitä, mutta todennäköisesti ymmärtänyt sen väärin, siksi lähdin sooloilemaan. Jos kerran luokkia ei voi ketjuttaa kahta luokkaa enempää, niin miten toteutetaan esim. projektinhallintaohjelma jossa yksi Projekti koostuisi useasta Miniprojektista, jotka taas koostuisi useista tehtävistä.

Projekti
MP MP MP
T T T T T T T T T T T

Olisin kuvitellut, että siinä tarvittaisiin kolme eri luokkaa, joiden perusteella objekteja luotaisiin, mutta ongelmana on periytyminen, eli kuinka Tehtävä objektit saa Projektin tiedot jos kerran luokat ei periydy niin pitkälle vaan ainoastaan (MP : P) ja (T : MP), mutta ei (T : MP : P) tai (T : P)

Eli onko rajapinnan käyttämisestä jotain apua vai vaan se etten ole ymmärtänyt mitä tämä periytyminen tarkoittaa?
Perimiseen liittyy on-suhde: koira on eläin ja suomenajokoira on koira. Myös kissa on eläin, mutta suomenajokoira ei ole kissa. vaikka se onkin eläin. Voisi siis olla jokseenkin tämännäköinen perintä-/luokkahierarkia:
Koodi:
               Eläin
                 |
       --------------------
       |                  |
     Koira              Kissa
       |
Suomenajokoira
Vastaavasti ajateltuna: onko tehtävä projekti? Onko projekti tehtävä? Yleensä vastaus molempiin lienee ei. Sen sijaan projektiin voi kuulua useita tehtäviä, joten projektilla voinee tältä kannalta katsottuna olla useita tehtäviä esim. kentäksi tallennetun listan/taulukon muodossa. Toisin sanottuna jotenkin näin:
Koodi:
class Task {
    // tänne jotain tehtävän tietoja, esim. nimi, päivämäärä, tekijä tai mitä nyt ikinä keksiikään

class Project {
    Task[] tasks;
}
Huomaa, ettei tässä ole minkäänlaista perintää. Riippuen siitä, mitä ihan tarkalleen ottaen tarkoitat miniprojektilla, se saattaisi olla tavallinen projekti, Project-luokasta peritty Miniproject-luokka tai täysin erillinen luokka, johon ei liity minkäänlaista perintäsuhdetta Project-luokan suhteen. Sen sijaan eläinesimerkissä menisi jotenkin näin:
Koodi:
class Elain {}

class Koira extends Elain {}

class Suomenajokoira extends Koira {}

class Kissa extends Elain {}
Huomannet eron?

Ja nyt kun olen näyttänyt esimerkin, totean samaan syssyyn, että eläinesimerkkiä ei taideta nykyään pitää kovin hyvänä. En siis välttämättä lähtisi mallintamaan eläinlajeja oikeasti luokkina, sillä hyvin mahdollisesti siinä tulee ampuneeksi itseään pitkällä tähtäimellä jalkaan. Joka tapauksessa yksinkertaiseen opetteluun eläinesimerkki lienee ihan käypä.

Loppuun vielä ydinasia tiivistettynä: periytyminen kuvaa sitä, mitä asiat ovat (engl. is), koostaminen taas sitä, mitä asioilla on (engl. has).
 
Liittynyt
02.12.2017
Viestejä
88
Kiitokset ojisama & Xiyng jälleen hyvistä vastauksista!!! Nämä selvitti hyvin!
class Elain {} class Koira extends Elain {} class Suomenajokoira extends Koira {} class Kissa extends Elain {}
Tuollaista esimerkkia en alkuun saanut toimimaan, johtuen siitä että testiversioissa jostain luokista uupui (default) constructorit. Ne lisäämällä sain luokat periytymään juuri näin kuten yllä selvensitte.

Luulin että luokkien periytymisessä on jotain mystistä, kun ei hätäisesti kyhätyssä testeissäni toiminut kuten loogista olisi ja tämän vuoksi sekoilin mm rajapintojen kanssa.

Hieno homma! Palaan taas asiaan tuonnempana...
 
Liittynyt
19.10.2016
Viestejä
1 245
Tuollaista esimerkkia en alkuun saanut toimimaan, johtuen siitä että testiversioissa jostain luokista uupui (default) constructorit. Ne lisäämällä sain luokat periytymään juuri näin kuten yllä selvensitte.
Johtuu siitä, että väänsin nuo vähän pseudokoodina, kun en jaksanut näpytellä ymmärtämisen kannalta epäolennaisia juttuja mukaan.
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
777
Sequelize kyssäri, eli miten saan luotua tai haettua sisäkkäisen modelin yhdellä ja samalla koodin pätkällä.

User luonti onnistuu kuten alla on esitetty, mutta jos koitan luoda toista eventtiä napsahtaa ValidationError. Koska ko. email on jo määritelty tauluun users.

Eli kuinka sais haettua ja luotua User (findOrCreate tyylillä) viittauksen email kentän (tai muiden uniikkien ) perusteella. Ilman erillistä User.find() kyselyä.

JavaScript:
// Event.belongsTo(User);
// Event.email === unique (index)

Event.create({
   start: new Date(),
    end: new Date(),
    User: { name: "Name", email: "Email" },
  },
  {
    include: [User],
  }
})
 
Liittynyt
02.12.2017
Viestejä
88
Yritän antaa sanastoa metodin parametrina, metodi on käsittääksei ok, mutta sen kutsuminen pääongelmassa antaa virheen. Ilmeisesti (rivi 28) vaatisi vielä viittauksen 'cars' sanastoon, mutta en tiedä missä muodossa se pitäisi antaa?

//seuraava rivi antaa virheen:
// Program.TestMethod(17, "Suzuki");
/* "main.cs(28,21): error CS1501: No overload for method `TestMethod' takes `2' arguments" */


Koodi:
using System;
using System.Collections.Generic;

namespace DictionaryAsArgument
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, string> cars = new Dictionary<int, string>()
            {
                {1, "Fiat" },
                {4, "Lada" },
                {16, "Nissan" }
            };
            //Loop over pairs with foreach
            foreach (KeyValuePair<int, string> pair in cars)
            {
                Console.WriteLine("FOReach KEYvaluepair {0} {1}", pair.Key, pair.Value);
            }
            // Use var keyword to enumerate Dictionary.
            foreach (var pair in cars)
            {
                Console.WriteLine("FOREACH VAR: {0} {1}", pair.Key, pair.Value);
            }
// Missä muodossa 'TestMethod'ia pitäisi kutsua, vaatii ilmeisesti viittauksen cars sanastoon, jotta toimisi??
//seuraava rivi antaa virheen:
         //   Program.TestMethod(17, "Suzuki");
           /*  "main.cs(28,21): error CS1501: No overload for method `TestMethod' takes `2' arguments"  */
     
        }

        public void TestMethod(Dictionary<int, string> cars)
        {
            foreach (var pair in cars)
            {
                Console.WriteLine("FOREACH2 VAR: {0} {1}", pair.Key, pair.Value);

            }
        }
    }
}
 
Viimeksi muokattu:
Liittynyt
14.12.2016
Viestejä
53
Metodisi odottaa yhtä parametria (tyypiltään Dictionary<int, string>) ja, niin kuin tuo virhe kertoo, olet tarjoamassa sille kahta (tyypeiltään int ja string) :think:
 
Liittynyt
02.12.2017
Viestejä
88
Metodisi odottaa yhtä parametria (tyypiltään Dictionary<int, string>) ja, niin kuin tuo virhe kertoo, olet tarjoamassa sille kahta (tyypeiltään int ja string) :think:
Ymmärsin varmaan väärin, mutta tälläisella kutsulla " Program.TestMethod(cars); " saan edelleen herjan, mutta erilaisen:

Koodi:
Severity    Code    Description    Project    File    Line    Suppression State
Error    CS0120    An object reference is required for the non-static field, method, or property 'Program.TestMethod(Dictionary<int, string>)'
 
Liittynyt
18.10.2016
Viestejä
366
Ymmärsin varmaan väärin, mutta tälläisella kutsulla " Program.TestMethod(cars); " saan edelleen herjan, mutta erilaisen:

Koodi:
Severity    Code    Description    Project    File    Line    Suppression State
Error    CS0120    An object reference is required for the non-static field, method, or property 'Program.TestMethod(Dictionary<int, string>)'
Joko teet TestMethodista staticin tai luot pääohjelmastasi olion, ensimmäinen lienee helpompi reitti.
 
Liittynyt
02.12.2017
Viestejä
88
Joko teet TestMethodista staticin tai luot pääohjelmastasi olion, ensimmäinen lienee helpompi reitti.
Tuo selvitti hyvin aiempaa kysymystä, mutta törmään edelleen ongelmaan kun yritän kutsua staattista metodia, jossa on sanasto parametrina, päävalikosta käsin. Ilmeisesti pitäisi tuo cars sanasto saada vietyä myös MainMenu() metodin tietoon, mutta se menee jo yli hilseen. Erilaisia combinaatioita yrittänyt, tuloksetta.

Koodi:
using System;
using System.Collections.Generic;

namespace CarDictionary
{
    class Program
    {
            static void Main(string[] args)
            {
                bool displayMenu = true;
                while (displayMenu == true)
                {
                    displayMenu = MainMenu();
                }
            }
            private static bool MainMenu()
            {
                Console.Clear();
                Console.WriteLine("\n Options:\n");
                Console.WriteLine(" 1) Display cars (not available)");
                Console.WriteLine(" 2) Hello world");
                Console.WriteLine(" 3) Exit");

                Console.WriteLine("\nSelect 1 / 2: ");
                string result = Console.ReadLine();
               
                if (result == "1")
                {
           
              //  Car.DisplayCars(cars);  //  main.cs(29,33): error CS0103: The name `cars' does not exist in the current context

                    return true;
                }
                else if ( result == "2")
                {
                  Car.HelloWorldMethod();
                  return true;
                }
                else if (result == "3")
                {
                    return false;
                }
                return true;
            }
    }//> Program class
    class Car
    {
        public Dictionary <int, string> cars; //  field

        public Car() // class constructor for the Car class
        {
            Dictionary<int, string> cars = new Dictionary<int, string>()
            {
                {1, "FIAT" },
                {4, "Lada" },
                {34, "Opel" }
            };
        }//constructor
        public static void DisplayCars(Dictionary<int, string> cars)
        {
            foreach (KeyValuePair<int, string> pair in cars)
            {
                Console.WriteLine("Foreach Keyvaluepair {0} - {1}", pair.Key, pair.Value);
            }
        }
        public static void HelloWorldMethod()
        {
          Console.WriteLine("Hyvät illanjatkot!");
          Console.ReadLine();
        }
    }
}



Koodi:
MainMenu()

Rivi 29 antaa herjan

Car.DisplayCars(cars);  //  main.cs(29,33): error CS0103: The name `cars' does not exist in the current context
 
Liittynyt
18.10.2016
Viestejä
366
Tuo selvitti hyvin aiempaa kysymystä, mutta törmään edelleen ongelmaan kun yritän kutsua staattista metodia, jossa on sanasto parametrina, päävalikosta käsin. Ilmeisesti pitäisi tuo cars sanasto saada vietyä myös MainMenu() metodin tietoon, mutta se menee jo yli hilseen. Erilaisia combinaatioita yrittänyt, tuloksetta.

Koodi:
using System;
using System.Collections.Generic;

namespace CarDictionary
{
    class Program
    {
            static void Main(string[] args)
            {
                bool displayMenu = true;
                while (displayMenu == true)
                {
                    displayMenu = MainMenu();
                }
            }
            private static bool MainMenu()
            {
                Console.Clear();
                Console.WriteLine("\n Options:\n");
                Console.WriteLine(" 1) Display cars (not available)");
                Console.WriteLine(" 2) Hello world");
                Console.WriteLine(" 3) Exit");

                Console.WriteLine("\nSelect 1 / 2: ");
                string result = Console.ReadLine();
             
                if (result == "1")
                {
         
              //  Car.DisplayCars(cars);  //  main.cs(29,33): error CS0103: The name `cars' does not exist in the current context

                    return true;
                }
                else if ( result == "2")
                {
                  Car.HelloWorldMethod();
                  return true;
                }
                else if (result == "3")
                {
                    return false;
                }
                return true;
            }
    }//> Program class
    class Car
    {
        public Dictionary <int, string> cars; //  field

        public Car() // class constructor for the Car class
        {
            Dictionary<int, string> cars = new Dictionary<int, string>()
            {
                {1, "FIAT" },
                {4, "Lada" },
                {34, "Opel" }
            };
        }//constructor
        public static void DisplayCars(Dictionary<int, string> cars)
        {
            foreach (KeyValuePair<int, string> pair in cars)
            {
                Console.WriteLine("Foreach Keyvaluepair {0} - {1}", pair.Key, pair.Value);
            }
        }
        public static void HelloWorldMethod()
        {
          Console.WriteLine("Hyvät illanjatkot!");
          Console.ReadLine();
        }
    }
}



Koodi:
MainMenu()

Rivi 29 antaa herjan

Car.DisplayCars(cars);  //  main.cs(29,33): error CS0103: The name `cars' does not exist in the current context
Tässä nyt on useampiakin ongelmia.

Suurin on, että Program ja Car ovat eri luokkia, cars on Car-luokassa, joten Program-luokasta käsin siihen ei voi noin viitata (tai voi viitata Car.cars, mutta silloin carsin pitäisi olla static ja alustettuna muualla kuin konstruktorissa ja tästä seuraisi monenlaista ikävyyttä). Joten luo uusi Car-olio.

Tämän jälkeen saat hienon virheilmoituksen, koska Car-luokan konstruktorissa esittelet uuden cars-muuttujan, joka peittää aiemman carsin eikä täten luokan sisäistä muuttujaa muuteta, joten tulostusfunktiossa foreach null ja poks.

Tuon korjattuasi sitten tulostuksen jälkeen tulee välittömästi Console.Clear(), joten et ehdi lukea mitään, mutta tämä lienee tässä vaiheessa toisarvoista :)
 
Liittynyt
02.12.2017
Viestejä
88
Tässä nyt on useampiakin ongelmia.

Suurin on, että Program ja Car ovat eri luokkia, cars on Car-luokassa, joten Program-luokasta käsin siihen ei voi noin viitata (tai voi viitata Car.cars, mutta silloin carsin pitäisi olla static ja alustettuna muualla kuin konstruktorissa ja tästä seuraisi monenlaista ikävyyttä). Joten luo uusi Car-olio.

Tämän jälkeen saat hienon virheilmoituksen, koska Car-luokan konstruktorissa esittelet uuden cars-muuttujan, joka peittää aiemman carsin eikä täten luokan sisäistä muuttujaa muuteta, joten tulostusfunktiossa foreach null ja poks.

Tuon korjattuasi sitten tulostuksen jälkeen tulee välittömästi Console.Clear(), joten et ehdi lukea mitään, mutta tämä lienee tässä vaiheessa toisarvoista :)
Hyvin selvennetty!

1. Mitä luulet olisiko helpompi tai ylipäänsä mahdollista siirtää mainmenukin Car luokkaan?
2. Vai onko parempia ideoita consoli menun toteutukselle, joka mahdollistaisi tuollaisten speciaalimetodeiden kutsumisen toisesta luokasta käsin?

Olisi hyvä, jos saisin jonkun tämän tyylisen ohjelman rungon toimivaksi (hyvä valikko, eri luokkia, omat metodit joka toiminnolle), niin voisin hyödyntää sitä niin monessa jutussa. :hmm:
 
Liittynyt
18.10.2016
Viestejä
366
1. Mitä luulet olisiko helpompi tai ylipäänsä mahdollista siirtää mainmenukin Car luokkaan?
Ei se olisi juurikaan helpompaa ja erittäinkin mahdollista, mutta sen hyöty olisi kyseenalaista, koska tällöinhän olisi sama kirjoittaa ohjelmaluokka kokonaan ilman Car-luokkaa ja lopputulos olisi sama kuin proseduraalisessa ohjelmoinnissa. Olio-ohjelmoinnin kantava ajatus kun kuitenkin on (merkityksellisten) luokkien teko. Suosittelisin siksi ennemmin tutustumaan @Overij'nkin linkkaamaan sivustoon ja miettimään olio-ohjelmoinnin periaatteita alusta alkaen. Hyvän alun (hypyn suoraan syvään päähän) saa, kun jättää pääluokkaan vain pääohjelman (pakottaa luomaan luokkia), staticin pois kaikesta, paitsi pääluokasta (pakottaa luomaan olioita niistä luokista) ja publicit kaikista muuttujista (pakottaa käyttämään gettereitä ja settereitä). Jos ohjelman tämän jälkeen saa toimimaan, niin se alkaa jo muistuttaa olio-ohjelmointia.

2. Vai onko parempia ideoita consoli menun toteutukselle, joka mahdollistaisi tuollaisten speciaalimetodeiden kutsumisen toisesta luokasta käsin?
Perusperiaate yksinkertaisiin valikoihin on tuollaisenaan ihan hyvä. Dynaamisten listojen täyttö olioilla, joilla on omat kutsunsa käyttöliittymäelementtien pyytämiselle ja olioiden sisäistä tilaa seuraavien valikkojen generointi näistä lennossa (mahdollisesti välimuistilla kikkaillen) menee sitten enemmän hifistelyn ja itserankaisun puolelle.

Olisi hyvä, jos saisin jonkun tämän tyylisen ohjelman rungon toimivaksi (hyvä valikko, eri luokkia, omat metodit joka toiminnolle), niin voisin hyödyntää sitä niin monessa jutussa. :hmm:
Valikko on ihan hyvä ja sinullahan on omat metodit joka toiminnolle, joten varsinaisesti opeteltavaa on vain eri luokkien käytössä. Muista, että luokan pitäisi sisältää kaikki ja vain kaikki itselleen tärkeät asiat ja antaa muiden räpeltää vain tarkkaan määrättyjä kohtia. Tätä ohjelmarunkoasi voisit kehittää oliomaisemmaksi ainakin huomaamalla, ettei lista autoista varsinaisesti ole Car-luokan ominaisuus. Jos Car mallintaa autoa, niin siihen kuuluu yhden auton tiedot, joten lista autoista kuuluu pikemminkin pääohjelman puolelle, jossa täytät sen Car-luokan olioilla. Etenkään autolistan tulostus ei kuulu Car-luokan vastuulle, joten lisäämällä Cariin (esimerkiksi) public string GetManufacturer():n voisit iteroida autolistan muualla oliotyylisemmin. Tokihan voisit myös luoda luokan, joka mallintaa autoluetteloa (jonka myöhemmin yleistät mallintamaan mitä tahansa luetteloa millä tahansa luokilla tekemään näillä mitä tahansa, jonka jälkeen kaiholla muistelet niitä aikoja, kun oli vain autoja)! Mahdollisuuksia on paljon, mutta kannattaa aloittaa perusteista.

Edit: GetModel->GetManufacturer, kun eihän meillä vielä malleja ollutkaan, vain valmistajia
 
Liittynyt
20.04.2017
Viestejä
534
CKEditor 4.14 ja pluginin monikielisyys - miten tulisi toteuttaa?
En löytänyt tutoriaalia ja nykyiset monikieliset pluginit kaatuu virheeseen:
ckeditor.js rivi 6553 Uncaught TypeError: a.langCode.replace is not a function
 
Liittynyt
02.12.2017
Viestejä
88
Ei se olisi juurikaan helpompaa ja erittäinkin mahdollista, mutta sen hyöty olisi kyseenalaista, koska tällöinhän olisi sama kirjoittaa ohjelmaluokka kokonaan ilman Car-luokkaa ja lopputulos olisi sama kuin proseduraalisessa ohjelmoinnissa. Olio-ohjelmoinnin kantava ajatus kun kuitenkin on (merkityksellisten) luokkien teko. Suosittelisin siksi ennemmin tutustumaan @Overij'nkin linkkaamaan sivustoon ja miettimään olio-ohjelmoinnin periaatteita alusta alkaen. Hyvän alun (hypyn suoraan syvään päähän) saa, kun jättää pääluokkaan vain pääohjelman (pakottaa luomaan luokkia), staticin pois kaikesta, paitsi pääluokasta (pakottaa luomaan olioita niistä luokista) ja publicit kaikista muuttujista (pakottaa käyttämään gettereitä ja settereitä). Jos ohjelman tämän jälkeen saa toimimaan, niin se alkaa jo muistuttaa olio-ohjelmointia.


Perusperiaate yksinkertaisiin valikoihin on tuollaisenaan ihan hyvä. Dynaamisten listojen täyttö olioilla, joilla on omat kutsunsa käyttöliittymäelementtien pyytämiselle ja olioiden sisäistä tilaa seuraavien valikkojen generointi näistä lennossa (mahdollisesti välimuistilla kikkaillen) menee sitten enemmän hifistelyn ja itserankaisun puolelle.


Valikko on ihan hyvä ja sinullahan on omat metodit joka toiminnolle, joten varsinaisesti opeteltavaa on vain eri luokkien käytössä. Muista, että luokan pitäisi sisältää kaikki ja vain kaikki itselleen tärkeät asiat ja antaa muiden räpeltää vain tarkkaan määrättyjä kohtia. Tätä ohjelmarunkoasi voisit kehittää oliomaisemmaksi ainakin huomaamalla, ettei lista autoista varsinaisesti ole Car-luokan ominaisuus. Jos Car mallintaa autoa, niin siihen kuuluu yhden auton tiedot, joten lista autoista kuuluu pikemminkin pääohjelman puolelle, jossa täytät sen Car-luokan olioilla. Etenkään autolistan tulostus ei kuulu Car-luokan vastuulle, joten lisäämällä Cariin (esimerkiksi) public string GetManufacturer():n voisit iteroida autolistan muualla oliotyylisemmin. Tokihan voisit myös luoda luokan, joka mallintaa autoluetteloa (jonka myöhemmin yleistät mallintamaan mitä tahansa luetteloa millä tahansa luokilla tekemään näillä mitä tahansa, jonka jälkeen kaiholla muistelet niitä aikoja, kun oli vain autoja)! Mahdollisuuksia on paljon, mutta kannattaa aloittaa perusteista.

Edit: GetModel->GetManufacturer, kun eihän meillä vielä malleja ollutkaan, vain valmistajia
Erittäin informatiivinen postaus (jälleen). Täytyy yrittää perehtyä tuohon moocin kurssiin ajan kanssa.

Palaan astialle tuonnempana...
 
Liittynyt
23.10.2016
Viestejä
485
Rekisteröin domain domainhotelli.fi:ssä. En vissiin pääsekkään muokkaamaan domainin tietueita ottamatta heiltä myös "webhotelli"-palvelua. Pystyn vaihtamaan vain nimipalvelimia.

Saako tuota .fi-domainia siirrettyä jollekin toiselle rekisteröijälle, joka antaisi täydet oikeudet domainiin ilman lisäkustannuksia?
 
Liittynyt
17.10.2016
Viestejä
4 857
Rekisteröin domain domainhotelli.fi:ssä. En vissiin pääsekkään muokkaamaan domainin tietueita ottamatta heiltä myös "webhotelli"-palvelua. Pystyn vaihtamaan vain nimipalvelimia.

Saako tuota .fi-domainia siirrettyä jollekin toiselle rekisteröijälle, joka antaisi täydet oikeudet domainiin ilman lisäkustannuksia?
Domainhotellista saa ilmaisen nimipalvelun, josta saat luotua DNS-tietueita. Et tarvitse muita palveluntarjoajia.


Ja saa siirrettyä. Mulla on domain tuolta ja nimipalvelimet ja muu sälä AWS:llä. Sellainenkin onnistuu.
 
Liittynyt
23.10.2016
Viestejä
485
Domainhotellista saa ilmaisen nimipalvelun, josta saat luotua DNS-tietueita. Et tarvitse muita palveluntarjoajia.


Ja saa siirrettyä. Mulla on domain tuolta ja nimipalvelimet ja muu sälä AWS:llä. Sellainenkin onnistuu.
Ahaa, eli en siis vain osaa.

Tässä screenshotti domainin asetuksista.

1590847993706.png


"Yksittäisiä DNS-tietueita (A, CNAME, MX, TXT, SRV) voi muokata webhotellin hallintapaneelissa kohdassa DNS-asetukset." En pääse tuonne hallintapaneeliin, koska mulla ei ole webhotellia. Jaksatko neuvoa kädestä pitäen mistä löytyy?

EDIT: Ei mitään. Siis pitikin erikseen tilata vielä 0€ hintainen nimipalvelu.
 
Liittynyt
14.12.2016
Viestejä
53
Juu, tilaamalla tuon ilmaisen nimipalvelun saat cPanelin käyttöön ja pääset DNS-asetuksia muokkailemaan vapaasti. Itselläni tuolla kanssa .fi-domain.
 
Liittynyt
03.07.2018
Viestejä
123
javascriptin Date:ssa on useita eri metodeita, kuten esim.
.toISOString()
jolla saa sql-muotoisen päivämäärän kun vähän leikkaa: myDate.toISOString().slice(0, 10);


Mutta tätä kun käyttää niin päivämäärä joka oli ihan hyvä ja ns. stringimuodossa, vaihtuukin sen aikavyöhyke yhtäkkiä
eli 1.6.2020 23:59 muuttuu 2.6.2020 02:59

Saako tästä jotenkin pois tuon ettei aikavyöhykettä oteta huomioon eikä kellonaikaa säädetä ?
Tarvetta olisi suomidatelle dd.mm.yyyy ja sql-datelle mm-dd-yyyy, sekä myös sql datetimelle

..Taisi myös koskea toLocaleString -metodia.
 
Liittynyt
03.07.2018
Viestejä
123
javascriptin Date:ssa on useita eri metodeita, kuten esim.
.toISOString()
jolla saa sql-muotoisen päivämäärän kun vähän leikkaa: myDate.toISOString().slice(0, 10);


Mutta tätä kun käyttää niin päivämäärä joka oli ihan hyvä ja ns. stringimuodossa, vaihtuukin sen aikavyöhyke yhtäkkiä
eli 1.6.2020 23:59 muuttuu 2.6.2020 02:59

Saako tästä jotenkin pois tuon ettei aikavyöhykettä oteta huomioon eikä kellonaikaa säädetä ?
Tarvetta olisi suomidatelle dd.mm.yyyy ja sql-datelle mm-dd-yyyy, sekä myös sql datetimelle

..Taisi myös koskea toLocaleString -metodia.
 

nnaku

I'm object-oriented!
Liittynyt
28.11.2016
Viestejä
777
javascriptin Date:ssa on useita eri metodeita, kuten esim.
.toISOString()
jolla saa sql-muotoisen päivämäärän kun vähän leikkaa: myDate.toISOString().slice(0, 10);


Mutta tätä kun käyttää niin päivämäärä joka oli ihan hyvä ja ns. stringimuodossa, vaihtuukin sen aikavyöhyke yhtäkkiä
eli 1.6.2020 23:59 muuttuu 2.6.2020 02:59

Saako tästä jotenkin pois tuon ettei aikavyöhykettä oteta huomioon eikä kellonaikaa säädetä ?
Tarvetta olisi suomidatelle dd.mm.yyyy ja sql-datelle mm-dd-yyyy, sekä myös sql datetimelle

..Taisi myös koskea toLocaleString -metodia.
Nii siis missä välissä tämä aikavyöhyke sekoilu tapahtuu?
 
Liittynyt
17.04.2017
Viestejä
91
Riippuu missä muodossa aika tulee tietokannasta ja missä muodossa tarvitset sen, mutta kuulostaa siltä että muunnat Date-objektin merkkijonksi, riisut siitä aikavyöhykkeen pois ja koitat parsia sen takaisin objektiksi, jolloin selain käyttää oletuksena paikallista aikaa. Älä mielellään parsi merkkijonoista aikaa ellei ole aivan pakko, vaan käytä sitä Date-objektia ja kasaa metodien & muuttujien avulla päivämäärä ja aika haluttuun muotoon (alla esimerkki).

JavaScript:
const date = new Date(); // 2020-06-04T19:23:19.358Z

// Selaimen paikallinen aika
const year = date.getFullYear()
const month = date.getMonth() + 1; // 0 = tammikuu
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();

const localDateString = `${day}.${month}.${year}`; // 4.6.2020
const localTimeString = `${hours}.${minutes}`; // 22.23

// UTC
const utcYear = date.getUTCFullYear()
const utcMonth = date.getUTCMonth() + 1;
const utcDay = date.getUTCDay();
const utcHours = date.getUTCHours();
const utcMinutes = date.getUTCMinutes();

const utcDateString = `${utcDay}.${utcMonth}.${utcYear}`; // 4.6.2020
const utcTimeString = `${utcHours}.${utcMinutes}`; // 19.23
- How To Work with Date and Time in JavaScript using Date Objects | DigitalOcean
- The definitive guide to JavaScript Dates
- Date
 
Toggle Sidebar

Uusimmat viestit

Ylläpitoa paikalla

Statistiikka

Viestiketjut
92 199
Viestejä
1 888 063
Jäsenet
39 675
Uusin jäsen
Kele12

Hinta.fi

Ylös Bottom