diff --git a/django/didgeridoo/currencies/exchange_rates.py b/django/didgeridoo/currencies/exchange_rates.py index bbc50a6..df33d6e 100644 --- a/django/didgeridoo/currencies/exchange_rates.py +++ b/django/didgeridoo/currencies/exchange_rates.py @@ -18,19 +18,26 @@ def get_exchange_rate(): # To develop i need a testresource. # In that case i comment the Online Resource block and uncomment the # development Block... + # ~~~~~~~~~~~~~~~~~~~~~ # Online Resource block: # ~~~~~~~~~~~~~~~~~~~~~ - # SNB_URL = 'https://www.snb.ch/selector/de/mmr/exfeed/rss' - # urlsocket = urllib.request.urlopen(SNB_URL) - # root = ET.parse(urlsocket) - # root = ET.ElementTree(root) - # today = datetime.now().strftime("%Y-%m-%d") + today = datetime.now().strftime("%Y-%m-%d") + SNB_URL = 'https://www.snb.ch/selector/de/mmr/exfeed/rss' + urlsocket = urllib.request.urlopen(SNB_URL) + root = ET.parse(urlsocket) + root = ET.ElementTree(root) + # ~~~~~~~~~~~~~~~~~~~~~ # development block: # ~~~~~~~~~~~~~~~~~~~~~ - root = ET.ElementTree(file='rss') - today = "2018-01-01" + # today = "2018-01-03" + # try: + # root = ET.ElementTree(file='rss') + # except Exception as e: + # print('exchange_rates.py_urlsocket failed %s ( + # %s) on date: %s for %s' + # % (e, type(e), root)) # ~~~~~~~~~~~~~~~~~~~~~ # Namespaces @@ -43,9 +50,7 @@ def get_exchange_rate(): # Pathvariables to XML Namespaces rate_path = 'cb:statistics/cb:exchangeRate/' observation_path = 'cb:statistics/cb:exchangeRate/cb:observation/' - exchange_rates = {} - for item in root.findall('none:item', ns): # THE CURRENCY DATE: datetime_str = item.find('dc:date', ns).text @@ -53,20 +58,19 @@ def get_exchange_rate(): # https://stackoverflow.com/a/12282040/4061870 # seams like snb striked the microsecond somewhere between Nov. and # Dez. 2017 so maybe first check time type is with milliseconds: - try: - date = datetime.strptime(''.join( - datetime_str.rsplit(':', 1)), - "%Y-%m-%dT%H:%M:%S.%f%z").strftime( - "%Y-%m-%d") - except Exception as e: - print('%s (%s)' % (e, type(e))) try: date = datetime.strptime(''.join( datetime_str.rsplit(':', 1)), "%Y-%m-%dT%H:%M:%S%z").strftime( "%Y-%m-%d") - except Exception as e: - print('%s (%s)' % (e, type(e))) + except: + try: + date = datetime.strptime(''.join( + datetime_str.rsplit(':', 1)), + "%Y-%m-%dT%H:%M:%S.%f%z").strftime( + "%Y-%m-%d") + except Exception as e: + print('%s (%s)' % (e, type(e))) # Print dates for development: # print("date:", date, "today:", today) # only the values of today are used so check for date in XML: @@ -122,7 +126,8 @@ def get_exchange_rate(): # Print the Dictionary: # print(exchange_rates) else: - break + exchange_rates = "SNB did not update the currencies for today." return(exchange_rates, today) + # for development its preferable to see that the for loop is done: # print('no more fresh data!') diff --git a/django/didgeridoo/currencies/migrations/0001_initial.py b/django/didgeridoo/currencies/migrations/0001_initial.py index c7f74a7..ee9f2f4 100644 --- a/django/didgeridoo/currencies/migrations/0001_initial.py +++ b/django/didgeridoo/currencies/migrations/0001_initial.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-18 18:01 +# Generated by Django 1.10.7 on 2018-01-09 18:21 from __future__ import unicode_literals from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -17,8 +18,31 @@ class Migration(migrations.Migration): name='ExchangeRate', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, unique=True)), - ('exchange_rate_to_chf', models.FloatField(max_length=5)), + ('exchange_rate_to_chf', models.DecimalField(decimal_places=5, max_digits=12)), ], ), + migrations.CreateModel( + name='ExchangeRate_date', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(unique_for_date=True, verbose_name='%Y-%m-%d')), + ], + ), + migrations.CreateModel( + name='ExchangeRate_name', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, unique=True)), + ], + ), + migrations.AddField( + model_name='exchangerate', + name='date', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='currencies.ExchangeRate_date'), + ), + migrations.AddField( + model_name='exchangerate', + name='name', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='currencies.ExchangeRate_name'), + ), ] diff --git a/django/didgeridoo/currencies/migrations/0002_exchangerate_date.py b/django/didgeridoo/currencies/migrations/0002_exchangerate_date.py deleted file mode 100644 index 37fb831..0000000 --- a/django/didgeridoo/currencies/migrations/0002_exchangerate_date.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-27 10:05 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='exchangerate', - name='date', - field=models.DateField(null=True), - ), - ] diff --git a/django/didgeridoo/currencies/migrations/0003_auto_20171227_1119.py b/django/didgeridoo/currencies/migrations/0003_auto_20171227_1119.py deleted file mode 100644 index c6283a2..0000000 --- a/django/didgeridoo/currencies/migrations/0003_auto_20171227_1119.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-27 10:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0002_exchangerate_date'), - ] - - operations = [ - migrations.AlterField( - model_name='exchangerate', - name='date', - field=models.DateField(null=True, verbose_name='%Y-%m-%d'), - ), - ] diff --git a/django/didgeridoo/currencies/migrations/0004_auto_20171229_1708.py b/django/didgeridoo/currencies/migrations/0004_auto_20171229_1708.py deleted file mode 100644 index ad84626..0000000 --- a/django/didgeridoo/currencies/migrations/0004_auto_20171229_1708.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-29 16:08 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0003_auto_20171227_1119'), - ] - - operations = [ - migrations.AlterField( - model_name='exchangerate', - name='name', - field=models.CharField(max_length=200), - ), - ] diff --git a/django/didgeridoo/currencies/migrations/0005_auto_20171229_1735.py b/django/didgeridoo/currencies/migrations/0005_auto_20171229_1735.py deleted file mode 100644 index 3ac6227..0000000 --- a/django/didgeridoo/currencies/migrations/0005_auto_20171229_1735.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-29 16:35 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0004_auto_20171229_1708'), - ] - - operations = [ - migrations.AlterField( - model_name='exchangerate', - name='date', - field=models.DateField(null=True, verbose_name='%Y-%m-%dT%H:%M:%S'), - ), - ] diff --git a/django/didgeridoo/currencies/migrations/0006_auto_20171229_1747.py b/django/didgeridoo/currencies/migrations/0006_auto_20171229_1747.py deleted file mode 100644 index a2a330b..0000000 --- a/django/didgeridoo/currencies/migrations/0006_auto_20171229_1747.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-29 16:47 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0005_auto_20171229_1735'), - ] - - operations = [ - migrations.AlterField( - model_name='exchangerate', - name='date', - field=models.DateTimeField(null=True, verbose_name='%Y-%m-%dT%H:%M:%S'), - ), - ] diff --git a/django/didgeridoo/currencies/migrations/0007_auto_20171229_1806.py b/django/didgeridoo/currencies/migrations/0007_auto_20171229_1806.py deleted file mode 100644 index 2455467..0000000 --- a/django/didgeridoo/currencies/migrations/0007_auto_20171229_1806.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.7 on 2017-12-29 17:06 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('currencies', '0006_auto_20171229_1747'), - ] - - operations = [ - migrations.AlterField( - model_name='exchangerate', - name='date', - field=models.DateField(null=True, verbose_name='%Y-%m-%d'), - ), - ] diff --git a/django/didgeridoo/currencies/models.py b/django/didgeridoo/currencies/models.py index e9fe0e7..73a09ba 100644 --- a/django/didgeridoo/currencies/models.py +++ b/django/didgeridoo/currencies/models.py @@ -1,4 +1,6 @@ from django.db import models +from decimal import Decimal +import datetime class ExchangeRate_name(models.Model): @@ -18,7 +20,7 @@ class ExchangeRate_date(models.Model): class ExchangeRate(models.Model): name = models.ForeignKey(ExchangeRate_name) date = models.ForeignKey(ExchangeRate_date) - exchange_rate_to_chf = models.FloatField(max_length=5) + exchange_rate_to_chf = models.DecimalField(max_digits=12, decimal_places=5) def __str__(self): - return self.name + return str(self.name) diff --git a/django/didgeridoo/currencies/templates/currencies/index.html b/django/didgeridoo/currencies/templates/currencies/index.html index d466c35..851d38f 100644 --- a/django/didgeridoo/currencies/templates/currencies/index.html +++ b/django/didgeridoo/currencies/templates/currencies/index.html @@ -3,34 +3,109 @@ -
-

Currencies in CHF

- {% if currency_list %} - + + {% else %} +

+ currency_USD_list missing. +

+ {% endif %} +
+

EURO:

+ {% if currency_EUR_list %} + + + {% for element in currency_EUR_list %} + {% for key, value in element.items %} + + {% endfor %} + {% endfor %} + + {% for element in currency_EUR_list %} + + {% for key, value in element.items %} + + {% endfor %} + + {% endfor %} +
{{ key }}
{{ value }}
{% else %}

- currency_list missing. + currency_EUR_list missing.

{% endif %}
-

{{ message }}

+

Japanese Yenn:

+ {% if currency_JPY_list %} + + + {% for element in currency_JPY_list %} + {% for key, value in element.items %} + + {% endfor %} + {% endfor %} + + {% for element in currency_JPY_list %} + + {% for key, value in element.items %} + + {% endfor %} + + {% endfor %} +
{{ key }}
{{ value }}
+ {% else %} +

+ currency_JPY_list missing. +

+ {% endif %}
+

Great Britain Pounds:

+ {% if currency_GBP_list %} + + + {% for element in currency_GBP_list %} + {% for key, value in element.items %} + + {% endfor %} + {% endfor %} + + {% for element in currency_GBP_list %} + + {% for key, value in element.items %} + + {% endfor %} + + {% endfor %} +
{{ key }}
{{ value }}
+ {% else %} +

+ currency_GBP_list missing. +

+ {% endif %} +
+ - raw_data - -
- today - -
- unique_dates_list - -
- unique_currencies_list - -
count_raw_data -
- count_currencies - -
- currencies_list - - currency_dict - + {{ count_raw_data }} -->
diff --git a/django/didgeridoo/currencies/views.py b/django/didgeridoo/currencies/views.py index 774513a..d4a2f32 100644 --- a/django/didgeridoo/currencies/views.py +++ b/django/didgeridoo/currencies/views.py @@ -1,5 +1,8 @@ from django.shortcuts import render -from currencies.models import ExchangeRate, ExchangeRate_date, ExchangeRate_name +import datetime +from currencies.models import (ExchangeRate, + ExchangeRate_date, + ExchangeRate_name) from currencies import exchange_rates @@ -8,109 +11,165 @@ def currencies(request): # evaluates if the values are already stored and # prepares the view all dynamicaly. # It can grow in terms of more Currencies over time automaticaly. + # try: + today = '1970-01-01' + raw_data = '' raw_data, today = exchange_rates.get_exchange_rate() + # except Exception as e: + # print('get_exchange_rate() %s (%s) on %s' + # % (e, type(e), today)) message_no = "Already querried today: " message_yes = " Updated successfully: " count_raw_data = 0 - for currency, rate in raw_data.items(): - count_raw_data += 1 - if ExchangeRate_date.objects.filter(date__date=today) \ - and ExchangeRate_name.objects.get(name=currency): - message_no += currency + ", " - # A: https://stackoverflow.com/a/27802801/4061870 - else: - if ExchangeRate_date.objects.filter(date=today)[:1]: - try: - date_dict = ExchangeRate_date.objects.filter(date=today).values() - date = date_dict[0]['date'] - date_id = date_dict[0]['id'] - except Exception as e: - print('date_dict %s (%s)' % (e, type(e))) - else: - try: - exdate = ExchangeRate_date.objects.create(date=today) - exdate.save() - except Exception as e: - print('exdate %s (%s)' % (e, type(e))) - if ExchangeRate_name.objects.filter(name=currency)[:1]: - try: - name_dict = ExchangeRate_name.objects.get(name=currency) - name = name_dict[0]['name'] - name_id = name_dict[0]['id'] - except Exception as e: - print('exdate %s (%s)' % (e, type(e))) - else: - try: - exname = ExchangeRate_name.objects.create(name=currency) - exname.save() - except Exception as e: - print('exname %s (%s)' % (e, type(e))) - try: - exrate = ExchangeRate.objects.create( - # name_id=name_id, - name_id=ExchangeRate_name.objects.only('id').get(name=currency).id, - # date_id=date_id, - date_id=ExchangeRate_date.objects.only('id').get(date=today).id, - exchange_rate_to_chf=rate, - ) - exrate.save() - message_yes += currency + ", " - - except Exception as e: - print('exrate %s (%s)' % (e, type(e))) - - # prepare messages: - message_no = message_no[::-1] # invert the string - message_no = message_no.replace(",", "!", 1) # replace first , with ! - message_no = message_no[::-1] # invert the string back - message_yes = message_yes[::-1] # invert the string - message_yes = message_yes.replace(",", "!", 1) # replace first , with ! - message_yes = message_yes[::-1] # invert the string back - - if len(message_no) > 24 and len(message_yes) > 23: - message = message_no + message_yes - elif len(message_no) > 24: - message = message_no - elif len(message_yes) > 23: - message = message_yes + if raw_data == "SNB did not update the currencies for today.": + message = """Die SNB hat die Währungsliste noch nicht aktualisiert.""" else: - message = "something whent wrong" + for currency, rate in raw_data.items(): + count_raw_data += 1 + if ExchangeRate.objects.filter( + date__date=today, + name__name=currency): + message_no += currency + ", " + # A: https://stackoverflow.com/a/27802801/4061870 + else: + if ExchangeRate_date.objects.filter(date=today)[:1]: + try: + # lustigerweise gibt .values() den value und den id + # zurück. Ohne .values() gibts nur den "value" + date_dict = ExchangeRate_date.objects.filter( + date=today).values() + date = date_dict[0]['date'] + date_id = date_dict[0]['id'] + except Exception as e: + print('exdate_exists %s (%s) on %s' + % (e, type(e), today)) + else: + try: + exdate = ExchangeRate_date.objects.create( + date=today) + exdate.save() + except Exception as e: + print('exdate_not_exists %s (%s) for %s' + % (e, type(e), today)) + if ExchangeRate_name.objects.filter( + name=currency)[:1]: + try: + name_dict = ExchangeRate_name.objects.filter( + name=currency).values() + name = name_dict[0]['name'] + name_id = name_dict[0]['id'] + except Exception as e: + print('exname_exists %s (%s) on %s' + % (e, type(e), currency)) + else: + try: + exname = ExchangeRate_name.objects.create( + name=currency) + exname.save() + except Exception as e: + print('exname_not_exists %s (%s) on %s' + % (e, type(e), currency)) + try: + exrate = ExchangeRate.objects.create( + # name_id=name_id, + name_id=ExchangeRate_name.objects.get( + name=currency).id, + # date_id=date_id, + date_id=ExchangeRate_date.objects.get( + date=today).id, + exchange_rate_to_chf=rate, + ) + exrate.save() + message_yes += currency + ", " + + except Exception as e: + print('exrate_create %s (%s) on %s for %s' + % (e, type(e), currency, today)) + + # prepare messages: + message_no = message_no[::-1] # invert the string + message_no = message_no.replace(",", "!", 1) # replace first , with ! + message_no = message_no[::-1] # invert the string back + message_yes = message_yes[::-1] # invert the string + message_yes = message_yes.replace(",", "!", 1) # replace first , with ! + message_yes = message_yes[::-1] # invert the string back + + if len(message_no) > 24 and len(message_yes) > 23: + message = message_no + message_yes + elif len(message_no) > 24: + message = message_no + elif len(message_yes) > 23: + message = message_yes + elif datetime.datetime.today().isoweekday() == 6: + message = """Die Abfrage wurde ohne ergebniss beendet. + Es ist Samstag, die SNB publiziert nur an Arbeitstagen neue Kurse... + """ + elif datetime.datetime.today().isoweekday() == 7: + message = """Die Abfrage wurde ohne ergebniss beendet. + Es ist Sonntag, die SNB publiziert nur an Arbeitstagen neue Kurse... + """ + else: + message = """Die Abfrage wurde ohne ergebniss beendet. + Kann es sein dass die SNB aufgrund eines Feiertages geschlossen ist? + """ currency_list = ExchangeRate.objects.all() + currency_USD_list = ExchangeRate.objects.filter(name__name='USD').values() + currency_EUR_list = ExchangeRate.objects.filter(name__name='EUR').values() + currency_JPY_list = ExchangeRate.objects.filter(name__name='JPY').values() + currency_GBP_list = ExchangeRate.objects.filter(name__name='GBP').values() + # ------------------------------------------------------------------- + # ------------------------------------------------------------------- + # I leave this part in the document as history. + # Problem is that i get the expected List with dictionaries like: + # view_currencies_list[ + # {'date': '2017-12-29, 'USD':'1.00', 'EUR':'1.00', 'GBP':'1.00', 'JPY':'1.00'}, + # {'date': '2017-12-30, 'USD':'1.00', 'EUR':'1.00', 'GBP':'1.00', 'JPY':'1.00'}, + # ] + # but the dict of 'date:' does not seam to deliver the same values as + # the dict's of key name:'USD' im not able to fix this in moment. + # nor am i able to generate a HTML table with date | USD | EUR | ... + # ------------------------------------------------------------------- + # ------------------------------------------------------------------- # prepare data to be displayed in a html table: # https://stackoverflow.com/questions/8749158/removing-duplicates-from-dictionary#8749473 - # atomar_dates # A: https://stackoverflow.com/questions/37205793/django-values-list-vs-values#37205928 # B: https://stackoverflow.com/questions/6521892/how-to-access-a-dictionary-key-value-present-inside-a-list - # dates_list = ExchangeRate_date.objects.values_list('date', flat=True) - # # atomar_currenies - # currencies_list = ExchangeRate_name.objects.values_list('name', flat=True) # # search for currencies in a date and apend them to the list - # currency_list = [] + # view_currency_list = [] + # view_currencies_list = ExchangeRate_name.objects.all() + # view_dates_list = ExchangeRate_date.objects.all() # count_date = 0 # count_currencies = 0 - # for date in dates_list: + # for view_date in view_dates_list: # count_date += 1 - # currency_dict = {} - # currency_dict['date'] = date - # for currency in currencies_list: + # view_currency_dict = {view_date} + # # view_currency_dict.update({}) + # for view_currency in view_currencies_list: # count_currencies += 1 # try: - # temp = ExchangeRate.objects.objects.only('exchange_rate_to_chf').get(name=currency).id - # #temp = ExchangeRate.objects.filter(date=unique_date, name=currency).values() # A - # exchange_rate_to_chf = temp[0]['exchange_rate_to_chf'] - # currency_dict = currency_dict.update({currency: exchange_rate_to_chf}) # B + # x = ExchangeRate.objects.filter(date__date=str( + # view_date), + # name__name=str( + # view_currency + # )).values() # A + # view_exchange_rate_to_chf = x[0]['exchange_rate_to_chf'] # except Exception as e: - # print('%s (%s)' % (e, type(e))) - # currency_list.append(currency_dict) - # assert False + # print('prepare_view %s (%s) for %s on %s is %s' + # % (e, type(e), view_currency, view_date, + # view_exchange_rate_to_chf)) + # view_exchange_rate_to_chf = " " + # + # view_currency_dict.update({view_currency: + # view_exchange_rate_to_chf}) # B + # + # view_currency_list.append(view_currency_dict) + # assert False return render(request, 'currencies/index.html', {'currency_list': currency_list, - 'raw_data': raw_data, - 'today': today, - # 'unique_dates_list': unique_dates_list, - # 'unique_currencies_list': unique_currencies_list, + 'currency_USD_list': currency_USD_list, + 'currency_EUR_list': currency_EUR_list, + 'currency_JPY_list': currency_JPY_list, + 'currency_GBP_list': currency_GBP_list, 'count_raw_data': count_raw_data, - # 'count_currencies': count_currencies, - # 'currency_dict': currency_dict, 'message': message}) diff --git a/django/didgeridoo/didgeridoo/settings.py b/django/didgeridoo/didgeridoo/settings.py index 405c1de..71b26b2 100644 --- a/django/didgeridoo/didgeridoo/settings.py +++ b/django/didgeridoo/didgeridoo/settings.py @@ -35,6 +35,7 @@ ALLOWED_HOSTS = [ # Application definition INSTALLED_APPS = [ + 'currencies', 'webshop.apps.WebshopConfig', 'django_extensions', 'django.contrib.admin', @@ -43,7 +44,6 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'currencies', ] MIDDLEWARE = [ diff --git a/django/didgeridoo/rss b/django/didgeridoo/rss index b1dc21a..b6be892 100644 --- a/django/didgeridoo/rss +++ b/django/didgeridoo/rss @@ -37,7 +37,7 @@ CH: 1.3081 CHF = 1 GBP 2017-11-27 Tägliche Kurse (11:00) https://www.snb.ch 1 GBP = 1.3081 CHF (Tägliche Kurse (11:00); 2017-11-27T12:16:53.767+01:00) - 2018-01-01T12:16:53.767+01:00 + 2018-01-03T12:16:53.767+01:00 de @@ -66,7 +66,7 @@ CH: 0.8813 CHF = 100 JPY 2017-11-27 Tägliche Kurse (11:00) https://www.snb.ch 100 JPY = 0.8813 CHF (Tägliche Kurse (11:00); 2017-11-27T12:16:53.760+01:00) - 2018-01-01T12:16:53.760+01:00 + 2018-01-03T12:16:53.760+01:00 de @@ -96,7 +96,7 @@ CH: 1.1697 CHF = 1 EUR 2017-11-27 Tägliche Kurse (11:00) https://www.snb.ch 1 EUR = 1.1697 CHF (Tägliche Kurse (11:00); 2017-11-27T12:16:53.750+01:00) - 2018-01-01T12:16:53.750+01:00 + 2018-01-03T12:16:53.750+01:00 de @@ -125,7 +125,7 @@ CH: 0.9803 CHF = 1 USD 2017-11-27 Tägliche Kurse (11:00) https://www.snb.ch 1 USD = 0.9803 CHF (Tägliche Kurse (11:00); 2017-11-27T12:16:53.737+01:00) - 2018-01-01T12:16:53.737+01:00 + 2018-01-03T12:16:53.737+01:00 de