2009-10-16 3 views
5

C'è un modo per, data una data, recuperare la stagione dell'anno? Per qualsiasi posto sul globo?Come posso ottenere la stagione corrente usando .NET? (Estate, inverno, ecc ...)

Si basa sul fuso orario e sull'emisfero?

Si noti che nell'emisfero australe l'estate è ancora nei mesi caldi.

EDIT:

Per chiarire, io sto parlando del astronomica seasons.

+1

Come si fa a definire Estate, Autunno, Inverno e Primavera? –

+1

Hai intenzione di volere altri periodi di Branding come Natale, Pasqua, Halloween etc ?? – inspite

+1

Chiunque cosa commentare sul downvote? Questa è una domanda reale. So che .NET ha il supporto per i fusi orari, immagino che le stagioni dovrebbero essere altrettanto abili. –

risposta

2

Non penso che sia standardizzato. Né è questa parte dei ben noti set di dati di globalizzazione.

+0

Stavo cercando un set di dati globalizzato. Ma, se non ce ne sono, prenderò solo quello che hai detto e correrò con lo standard americano. –

0

Personalmente, a meno che non fosse richiesto direttamente, descriverei le diverse sezioni in base al trimestre anziché al clima/periodo dell'anno.

+0

È per il marchio stagionale. –

+4

Quindi chi sta facendo il marketing/branding dovrebbe dirti quando dovresti passare dall'estate all'autunno. Aspettarsi in qualche modo che un computer riesca a capirlo è solo un piccolo passo per avere HAL a governare il mondo. –

4

La risposta dipende esattamente da come si desidera definire ogni stagione. Questo grafico allo Wikipedia mostra il giorno esatto e l'ora cambia leggermente di anno in anno.

Una soluzione semplice che potrebbe essere "abbastanza buona" consiste nell'utilizzare quattro date fisse, ad esempio: 20 marzo, 21 giugno, 22 settembre e 21 dicembre.

2

Qualcun altro può snocciolare il codice per voi rapidamente, ma fin Wikipedia.org article si fa riferimento abbiamo questa:

Le zone temperate

Siamo in grado di distinguere chiaramente sei stagioni. Le date qui elencati sono per la Emisfero Nord: [citazione necessaria]

* Prevernal (1 March–1 May) 
* Vernal (1 May–15 June) 
* Estival (15 June–15 August) 
* Serotinal (15 August–15 September) 
* Autumnal (15 September–1 November) 
* Hibernal (1 November–1 March) 

È quindi possibile scrivere una funzione GetTemperateSeason() per restituire l'elencazione di cui sopra in base alle gamme mese.

0

nord/sud:

21/03 - inizio della primavera/autunno

21/06 - inizio estate/inverno

23/09 - inizio autunno/primavera

22/12 - inizio inverno/estate

a volte viene cancellato per uno o due giorni, ma per questo è necessario controllare siti come: timeanddate.com

+0

Non ci sono date specifiche per le stagioni, poiché dipendono dalla temperatura media. – Guffa

+0

In realtà la data cambia in base al solstizio e all'equinozio e non alla temperatura. – JamesEggers

2
public class Season 
{ 
    private const string WINTER = "Winter"; 
    private const string SPRING = "Spring"; 
    private const string SUMMER = "Summer"; 
    private const string AUTUMN = "Autumn"; 

    public string Name { get; set; } 
    public string Value { get; set; } 

    public List<Season> LastFiveBillingQuarters 
    { 
     get 
     { 
      IList<Season> billingPeriods = new List<Season>(); 
      StringBuilder sbDisplayText; 
      DateTime billingPeriod; 

      for (int i = 0; i >= -12; i -= 3) 
      { 
       billingPeriod = DateTime.Now.AddMonths(i); 
       var month = billingPeriod.Month; 
       var day = billingPeriod.Day; 
       var year = billingPeriod.Year; 
       var ticks = billingPeriod.ToString(); 

       sbDisplayText = new StringBuilder(); 

       if ((month >= 12 || month < 03) & day >= 22) 
        sbDisplayText.Append(WINTER); 
       else if (month >= 09 & day >= 23) 
        sbDisplayText.Append(AUTUMN); 
       else if (month >= 06 & day >= 21) 
        sbDisplayText.Append(SUMMER); 
       else if (month >= 03 & day >= 21) 
        sbDisplayText.Append(SPRING); 

       sbDisplayText.Append(string.Format("{0}{1}", " ", year)); 

       billingPeriods.Add(new Season() { Name = sbDisplayText.ToString(), Value = ticks }); 
      } 

      return billingPeriods.ToList(); 
     } 
    } 
} 
+0

Questo è corretto solo se vivi nell'emisfero settentrionale. – Simone

10

È possibile utilizzare questo semplice codice:

private int getSeason(DateTime date) { 
    float value = (float)date.Month + date.Day/100; // <month>.<day(2 digit)> 
    if (value < 3.21 || value >= 12.22) return 3; // Winter 
    if (value < 6.21) return 0; // Spring 
    if (value < 9.23) return 1; // Summer 
    return 2; // Autumn 
} 

Per includere le stagioni del Sud del mondo il codice può diventare:

private int getSeason(DateTime date, bool ofSouthernHemisphere) { 
    int hemisphereConst = (ofSouthernHemisphere ? 2 : 0); 
    Func<int, int> getReturn = (northern) => { 
     return (northern + hemisphereConst) % 4; 
    }; 
    float value = (float)date.Month + date.Day/100f; // <month>.<day(2 digit)> 
    if (value < 3.21 || value >= 12.22) return getReturn(3); // 3: Winter 
    if (value < 6.21) return getReturn(0); // 0: Spring 
    if (value < 9.23) return getReturn(1); // 1: Summer 
    return getReturn(2); // 2: Autumn 
} 
+0

I due emisferi verticali hanno stagioni opposte, quindi come lo spiegherete? –

+1

B.K., ho modificato la risposta, ma non eseguo alcun test. – riofly

+1

Cambia '100' in' 100f', o quel calcolo produrrà sempre un numero intero. –

Problemi correlati