小编dan*_*ela的帖子

当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳做法

关于在DB中保存日期时间和时区信息有很多问题,但总体水平更多.在这里,我想谈谈一个具体的案例.

系统规格

  • 我们有一个订单系统数据库
  • 这是一个多租户系统,租户可以使用任意时区(每个租户是任意的,但是单个时区,一次保存在租户表中,永不改变)

DB中需要涵盖业务规则

  • 当租户将订单放入系统时,订单编号将根据其本地日期时间计算(它不是字面上的数字,而是某种类型的标识符ORDR-13432-Year-Month-Day).精确计算目前并不重要,重要的是它取决于租户的本地日期时间
  • 我们还希望能够在系统级别上选择所有订单,放置在某些UTC日期时间之间,而不管租户如何(对于一般系统统计/报告)

我们最初的想法

  • 我们最初的想法是在整个数据库中保存UTC日期时间,当然,保持租户时区相对于UTC的偏移量,并且使用DB的应用程序总是将日期时间转换为UTC,以便DB本身始终使用UTC.

方法1

  • 保存当地租户的日期时间对每个租户来说都不错,但是我们遇到的问题包括:

    SELECT * FROM ORDERS WHERE OrderDateTime BETWEEN UTCDateTime1 AND UTCDateTime2
    
    Run Code Online (Sandbox Code Playgroud)

这是有问题的,因为OrderDateTime在这个查询中意味着基于租户的不同时刻.当然,此查询可能包括连接到Tenants表以获取本地日期时间偏移量,然后将在运行中进行计算OrderDateTime以进行调整.这是可能的,但不确定这是否是一个好方法呢?

方法2

  • 另一方面,当保存UTC日期时间时,那么当我们计算OrderNumber时,因为UTC中的日/月/年可能与本地日期时间不同

让我们举一个极端的例子; 让我们说租户比UTC早6个小时,他的当地日期时间是2017-01-01 02:00.UTC会是2016-12-31 20:00.此时下达的订单应该获得OrderNumber 'ORDR-13432-2017-1-1'但是如果保存UTC则会得到ORDR-13432-2016-12-31.

在这种情况下,在DB中创建Order时,我们应该根据重新计算的租户本地时间获得UTC日期时间,租户偏移和编译OrderNumber,但仍然以UTC格式保存DateTime列.

问题

  1. 处理这种情况的首选方法是什么?
  2. 是否有一个很好的解决方案,保存UTC日期时间,因为系统级报告,这对我们来说会很好吗?
  3. 如果使用保存UTC,是方法2)处理这些情况的好方法还是有一些更好/推荐的方式?

[UPDATE]

根据Gerard Ashton和Hugo的评论:

如果租户可以改变时区,那么最初的问题就细节而言并不明确,如果政治当局改变时区属性或某个时区的时区会发生什么.当然,这是非常重要的,但它不是这个问题的核心.我们可以在另一个问题中解决这个问题.

为了这个问题,让我们假设租户不会改变位置.该位置的时区属性或时区本身可能会发生变化,这些更改将在系统中与此问题分开处理.

timezone datetime utc datetimeoffset dst

30
推荐指数
2
解决办法
3万
查看次数

如何使用android数据绑定设置SwipeRefreshLayout刷新属性?

我正在使用android数据绑定库.如果我想让视图可见,我可以写这样的东西:

<TextView
            android:id="@+id/label_status"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@{habitListViewModel.message}"
            app:visibility="@{habitListViewModel.hasError ? View.VISIBLE : View.GONE}" />
Run Code Online (Sandbox Code Playgroud)

是否有以类似(xml)方式绑定到swipeRefreshLayout的刷新属性的选项?

目前我通过调用setRefreshing(true/false)在代码中设置它,但是希望在xml中使它保持一致.

data-binding android android-layout swiperefreshlayout

24
推荐指数
2
解决办法
1万
查看次数

Android Studio变得非常缓慢且不断"更新索引"

在SO上有更多类似的问题,但我没有找到他们的答案,所以我开了新的.

我在用:

Android Studio 2.2.3(但与2.2.2相同)Gradle 2.14.1 JRE 1.8.0

我在mac,OS X El Capitan(2.5 GHz,i5,8GB RAM)上使用它.

它在几周前一直很好用,现在它的速度非常缓慢.大多数时候它是"索引/更新索引".

我并不关心构建时间(它需要大约30-40秒,但我可以忍受)与那种使编码几乎不可能的常量索引一样(整体响应性非常差).

我的gradle文件中是否有任何可能导致此问题的内容?

我确实有一些依赖,但应用程序本身相对简单.

build.gradle // app

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {

compileSdkVersion 23
buildToolsVersion "23.0.2"

dataBinding {
    enabled = true
}

defaultConfig {
    applicationId "com.example.myproduct"
    minSdkVersion 19
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
   }
}
dependencies {

    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:support-v4:23.2.+'
    compile …
Run Code Online (Sandbox Code Playgroud)

java performance android gradle android-studio

24
推荐指数
5
解决办法
2万
查看次数

Android客户端应用程序中"数据层"的最佳实践

这是一个设计/最佳实践问题..

我是Android开发的新手,基本上是Web /移动解决方案的新手.

所以,我的问题是 - 在组织从远程服务器获取数据的android应用程序结构时,最佳做法是什么?

应该请求服务器进入一个与服务器进行通信的类(获取和发布请求),还是应该将我的请求看作数据源,这意味着每个数据类都为自己管理它?

或者我应该有更多抽象级别 - 一个级别用于获取数据,另一个级别用于使用某些接口但不知道源数据来自哪个?

我很好奇Android开发人员如何处理这些设计问题......

android design-patterns data-access-layer remote-access application-design

14
推荐指数
2
解决办法
1万
查看次数

如何重用iOS/xcode中的颜色和样式?

Android,WPF以及我一直在使用的大多数平台都可以在单个文件中重用和"集中"ui资源,如颜色和样式.

在android中它可以这样做:

在colors.xml文件中:

<color name="secondary_text_color">#ffcc67</color>
Run Code Online (Sandbox Code Playgroud)

在任何视图中:

<TextView text="some text" textColor="@colors/secondary_text_color" />
Run Code Online (Sandbox Code Playgroud)

iOS中有类似的东西吗?

我不是想在iOS中复制android,但我正在努力理解应该遵循的ui重用模式(如果有的话).

我遇到的唯一的事情是在代码中定义主题,并在代码背后重用它,这是正确的方法吗?

user-interface code-reuse design-patterns ios swift

8
推荐指数
1
解决办法
3381
查看次数

Viola Jones面部检测 - 物体/面部大小的变化

我试图了解Viola Jones的方法,而且我大部分时间都明白了.

它使用简单的Haar类似功能提升为强分类器,并组织成层/级联,以实现更好的性能(不打扰明显的"非对象"区域).

我想我理解积分图像,我理解这些特征的计算值.

我唯一想不通的是算法如何处理面部大小的变化.

据我所知,他们使用24x24子窗口在图像上滑动,并在其中算法通过分类器并试图弄清楚它上面是否有面/对象.

而我的问题是 - 如果一张脸是10x10尺寸,还是其他100x100呢?那么会发生什么?

而且我很想知道前两个功能是什么(在级联的第一层),它们是怎样的(记住这两个功能,根据Viola和Jones,几乎不会错过任何一张脸,并将消除60%的错误)?怎么样??

并且,如何构建这些功能以处理图像中不同面部大小的这些统计信息?

我错过了什么,或者我认为这一切都错了?

如果我不够清楚,我会试着更好地解释我的困惑.

opencv image-processing computer-vision face-detection viola-jones

5
推荐指数
1
解决办法
3298
查看次数

Android - 多态性和 Parcelable

从包裹中写入/读取时,我无法弄清楚如何使用多态性。我知道我需要在基类以及所有派生类中实现 Parcelable(在子类具有我想写入包裹的附加属性的情况下)。我不明白并且我不知道它是否可能是 - 如何从 Parcelable 读取子类,即,我怎么知道我正在从 Parcel 读取什么样的子类。我可以做一些 hack,比如在包中写入一些指示符,它会告诉我要使用什么类加载器,但我认为会有一些更优雅的方式,否则就没有太多的多态性使用。

为了说明我的问题,假设我有这样的课程:

形状类

public class Shape implements Parcelable {
public float area;

public Shape() {
}

public Shape(Parcel in) {
    area = in.readFloat();
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeFloat(area);
    }
//CREATOR etc..
}
Run Code Online (Sandbox Code Playgroud)

矩形形状类

 public class RectangleShape extends Shape {

    float a;
    float b;

    public RectangleShape(Parcel in) {
        super(in);
        a = in.readFloat();
        b = in.readFloat();
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeFloat(area);
        dest.writeFloat(a);
        dest.writeFloat(b);
    }

//CREATOR etc.. …
Run Code Online (Sandbox Code Playgroud)

java polymorphism android parcelable

5
推荐指数
1
解决办法
903
查看次数

Is livedata builder ok for one-shot operations?

For example, let's say that we have a product catalog view with an option to add product to a cart. Each time when user clicks add to cart, a viewModel method addToCart is called, that could look like this:

//inside viewModel
fun addToCart(item:Item): LiveData<Result> = liveData {
    val result = repository.addToCart(item) // loadUser is a suspend function.
    emit(result)
}


//inside view
addButton.onClickListener = {
     viewModel.addToCart(selectedItem).observe (viewLifecycleOwner, Observer () {
          result -> //show result
    }
}
Run Code Online (Sandbox Code Playgroud)

What happens after adding for …

android mvvm kotlin android-livedata

5
推荐指数
1
解决办法
1171
查看次数

在片段内使用带有单个活动、布局抽屉和工具栏的 Android 导航组件

是否可以在每个片段都有自己的工具栏的单个活动应用程序中使用 Android 导航组件/图形?

此外,容器活动有一个导航抽屉,需要设置工具栏和导航控制器,但在活动创建时我还没有工具栏。

我正在使用此代码(在 onCreate 中调用)

    private fun setupNavigation() {

//        val toolbar = findViewById<Toolbar>(R.id.toolbar);
//        setSupportActionBar(toolbar);
//        supportActionBar!!.setDisplayHomeAsUpEnabled(true);
//        supportActionBar!!.setDisplayShowHomeEnabled(true);

    val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout);

    val navigationView = findViewById<NavigationView>(R.id.drawer_navigation_view);

    val navController = Navigation.findNavController(this, R.id.navigation_host_fragment);

    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

    NavigationUI.setupWithNavController(navigationView, navController)

    navigationView.setNavigationItemSelectedListener(this)
}
Run Code Online (Sandbox Code Playgroud)

但是由于我当时没有工具栏,它会引发错误(在空对象上调用 ActionBar.setTitle)。

是否有可能有这个,或者我需要放弃在这种情况下使用导航组件的想法?

android navigation-drawer android-navigation android-navigationview android-architecture-navigation

4
推荐指数
1
解决办法
1693
查看次数

从多台机器(多个操作系统)使用 System.Drawing 包

我们正在构建一个使用 System.Drawing 包的 .Net Core 2.0 C# Web 应用程序。

我在Mac上编写代码,但它也会在Windows机器上开发,并部署到Linux服务器上。

要在 OSX 上使用 System.Drawing,我必须将 runtime.osx.10.10-x64.CoreCompat.System.Drawing Nuget 包添加到我的项目依赖项中。

但该代码现在无法在 Windows 机器上运行。当尝试使用 Graphics(System.Drawing 的一部分)对象的 DrawString 方法时,我们得到 System.AccessViolationException。

所以,我的问题是解决这个问题的常用方法是什么?是否可以在这个多操作系统设置中使用 System.Drawing 类?

c# system.drawing multiplatform .net-core

0
推荐指数
1
解决办法
1150
查看次数