Diskuze: ASP .Net - časová pásma
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Ahoj,
s krásou timezón jsem bojoval pár týdnů z5. Ukládání do databáze UTC
čas je rozhodně výhoda. Nicméně ukazovat uživateli UTC už je blbost. Si
vezmi, že bych byl někde s UTC+10, odeslal koment a najednou viděl, že jsem
odeslal koment v 03:15 místo 13:15
Předpokládám, že časy už renderuješ přímo do HTML, takže u
klienta se ti nic nemění. Já řešil právě problém s tím, co mám odeslat
na server, pak do toho srát ještě DST (daylight saving time - letní/zimní
čas, jak to vůbec v JS detekovat? apod.). Tvé řešení může být
jednoduché. Jednoduše při requestu na příspěvky ještě odešli offset
vůči UTC a pak už to jen zkonvertuj. Popřípadě si to ajaxově odešli při
loadu a pak s tím pracuj... Záleží na kontextu jakým píšeš tu appku, my
načítáme všechen hlavní content skrz ajax, takže už máme na serveru
takové info jako server offset, client offset a další info. Kdyžtak mi
řekni jaký máš kontext a můžu ti poradit více specifičtěji.
Ahoj,
díky za comment. Můj hlavní problém je že se mi zatím nepodařilo zjistit jak získat časovou zónu (offset oproti UTC) od uživatele. Pokud budu mít ten offset tak se s tím už nějak poperu. De facto jsou podle mě možnosti dvě, buď si ten offset uložit do databáze k danému času a nebo ho použít až po načtení dat do stránky a zobrazované časy posunout o ten offset. Načítání dat mám řešeno pomocí vlastní třídy která se stará o získání dat z databáze a já je pak vkládám do stránky (datumu vkládám jako text do asp labelu), takže si s tím před zobrazením můžu dělat co chci a libovolně to upravovat.
Beru zpět, ukládat to do db je blbost, musím to ukládat jako UTC a offset
řešit až při requestu 
http://www.w3schools.com/…neoffset.asp
Jen si to v nějaké metodě budeš muset poslat 
Načítej si data ajaxově, pak jen načteš stránku a při requestu na commenty k tomu postneš i svůj offset.
Date.prototype.getClientTimeZoneOffset = function () {
return (this.getTimezoneOffset() / -60);
}
Ale bacha, vrací to i včetně DST.
Díky, konečně jsem se k tomu dostal a předělávám to aby se to načítalo ajaxově. Jen jsem pořád nějak nepochopil jak zjistit tu časovou zónu. Ta funkce kterou voláš a jejíž výsledek vracíš:
return (this.getTimezoneOffset() / -60);
voláš konkrétně kde?
Když posilas request. Jak se dostanu domu tak se trosku rozepisu.
Sorry, zapomněl jsem.
Dejme tomu, že tohle jsou modely:
public class TempViewModel
{
public string Title { get; set; }
}
public class MessagesModel
{
public IList<MessageModel> Messages { get; set; }
}
public class MessageModel
{
public string Text { get; set; }
public DateTime DateCreated { get; set; }
}
Pak máš nějaký kontroller (u mě HomeController):
public ActionResult TempView()
{
var model = new TempViewModel();
model.Title = "some title";
return View(model);
}
public string RenderPartialView(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData
.GetRequiredString("action");
ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines
.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext,
viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
public JsonResult GetMessages(int timezoneOffset = 0)
{
var model = new MessagesModel() { Messages = new List<MessageModel>() };
for (int i = 0; i < 10; i++)
model.Messages.Add(new MessageModel { Text = $"nejaky text {i}", DateCreated = DateTime.UtcNow.AddHours(i + timezoneOffset) });
return Json(new
{
result = true,
view = RenderPartialView("MessageList", model),
});
}
Btw, tu RenderPartial metodu jsem nepsal, ani jsem to nezkoumal, jen vzal první co fungovalo.
Pak mám nějaké TemView (včetně JS):
@model WebApplicationMVC.Models.TempViewModel
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">@Model.Title</h1>
</div>
<div id="messagesContainer">
</div>
</div>
<script>
Date.prototype.getClientTimeZoneOffset = function () {
return (this.getTimezoneOffset() / -60);
}
$(document).ready(function () {
$.ajax({
type: "POST",
url: "GetMessages",
data: { timezoneOffset: new Date().getClientTimeZoneOffset() },
success: function (data, status) {
if (data.result) {
$("#messagesContainer").html(data.view);
}
},
error: function errorFunc() {
console.log("error");
}
});
});
</script>
A nakonec MessageList view, které mi renderuje ty zprávy:
@model WebApplicationMVC.Models.MessagesModel
@if (Model != null && Model.Messages.Any())
{
foreach (var message in Model.Messages)
{
<div class="message">
<span>@message.DateCreated + @message.Text</span>
</div>
}
}
Když pak pustíš server s nějakým timezone offsetem (momentálně UTC+2), tak bys měl dostat ten první čas jako ten, který máš právě na PC. Pak když ho změníš a refreshneš stránku, tak bys ho měl vidět pořád překonvertovaný jako ten tvůj.
Lze si v Global.asax nastavit, že veškerý čas, co opustí server je UTC a pak už by si to měl JS přebrat sám...
Zobrazeno 11 zpráv z 11.